Apples Wo Ist? Integration in FHEM

Begonnen von Guybrush, 13 August 2026, 15:25:00

Vorheriges Thema - Nächstes Thema

Guybrush

Ich habe bei mir Apples Wo Ist? integriert. Die bisherigen Ansätze über Homekit usw waren mir zu kompliziert. Da ich auch das Rad nicht komplett neu erfinden wollte habe für die Einbindung nun pyicloud genommen, was aktiv gepflegt wird. Da das aber keine vernünftige Schnittstelle für FHEM gab, habe ich eine mqtt bridge entwickelt, womit man nun direkt über mqtt mit pyicloud kommunizieren kann und sowohl die Standorte erhält als auch Lokalisierung starten kann. FHEM mit MQTT wird natürlich vorausgesetzt. Man kann das tool auch nutzen um wichtige Meldungen direkt auf dem iPhone anzeigen zu lassen ;) Ich hab das bei mir primär zum suchen meiner Geräte bei mir umgesetzt. Aber auch eine Anwesenheitserkennung lässt sich damit robust umsetzen.

https://github.com/next81/findmy2mqtt

Das Ganze ist dort schon kurz beschrieben, aber hier nochmal in kürze für debian:

sudo apt update
sudo apt install -y git python3 python3-full python3-pip python3-venv ca-certificates

git clone https://github.com/next81/findmy2mqtt.git
cd findmy2mqtt

sudo ./install.sh

Die Config ist selbsterklärend und liegt im YAML Format default unter:
/etc/findmy2mqtt/config.yaml

Nachdem die config angepasst ist muss der Login zu apple hergestellt werden:
findmy2mqtt password <person1>
findmy2mqtt auth <person1>

Dabei sollte dann die 2FA von apple angestoßen werden. Die Pin sollte dann im Prompt eingegeben werden.

wenn das durch ist können testweise die devices abgefragt werden:
findmy2mqtt devices <person1>


wenn das geht, dann findmy2mqtt als service einrichten:
systemctl enable --now findmy2mqtt

Danach sollten neue mqtt devices in FHEM auftauchen. Ein Beispiel Device für FHEM ist auch in der Github Readme enthalten.

CQuadrat

Danke dafür!

Ich werde es die Tage mal ausprobieren.
FHEM auf Mini-ITX-Server mit Intel Quad-Core J1900:
+ HM: HM-LAN, HM-USB, HM-MOD-UART mit div. HM-Komponenten
+ RFXtrx: Funkwetterstation Bresser mit ext. Thermometer, Regenmesser und Windmesser
+ TUL (KNX-Anbindung), MQTT, SONOS (div. Gimmicks), OneWire, Hue

binford6000

Vielen Dank fürs Entdecken!
Ich habe die FHEM Definition aus dem github Repo mal etwas angepasst:

defmod iphone_sebastian.fm MQTT2_DEVICE
attr iphone_sebastian.fm autocreate 0
attr iphone_sebastian.fm devicetopic findmy/person/deviceid
attr iphone_sebastian.fm event-on-change-reading .*
attr iphone_sebastian.fm readingList $DEVICETOPIC/state:.* { json2nameValue($EVENT) }
attr iphone_sebastian.fm setList locate $DEVICETOPIC/locate\
message:textField {"$DEVICETOPIC/message ".(split(/ /,$EVENT,2))[1]}
attr iphone_sebastian.fm timestamp-on-change-reading .*
attr iphone_sebastian.fm userReadings presence {findmyPresence($name)}

Die Fn "findmyPresence" für das presence userReading basiert auf lat und long in global und wurde mit Hilfe von KI generiert:
sub findmyPresence($) {
  my ($name) = @_;
  my $homeRadius = 150;  # Umkreis in Metern um Zuhause, der noch als "home" gilt
  my $lat1 = ReadingsVal($name,"latitude",undef);
  my $lon1 = ReadingsVal($name,"longitude",undef);
  my $lat2 = AttrVal("global","latitude",undef);
  my $lon2 = AttrVal("global","longitude",undef);
  return "unknown" if(!defined($lat1) || !defined($lon1) || !defined($lat2) || !defined($lon2));
  my $pi = 3.14159265358979;
  my $earthRadius = 6371000;  # Erdradius in Metern
  my $dLat = ($lat2-$lat1)*$pi/180;
  my $dLon = ($lon2-$lon1)*$pi/180;
  my $a = sin($dLat/2)**2 + cos($lat1*$pi/180)*cos($lat2*$pi/180)*sin($dLon/2)**2;
  my $c = 2*atan2(sqrt($a),sqrt(1-$a));
  my $distance = $earthRadius*$c;
  return ($distance <= $homeRadius) ? "present" : "absent";
}

VG Sebastian

Guybrush

#3
die idee ist gut. das übernehme ich mal ;) ich würd nur schematisch die home koordinaten mit attributen und nicht mit readings setzen und statt undef 0 nehmen. das setlist passe ich auch im beispiel noch an. ich hatte den topic erst noch anders und nicht umgestellt als ich das vereinheitlicht hab.

ich hab in dem kontext auch die darstellung noch angepasst:

attr FindMy.AndreasiPhone devStateIcon (0|1)\d?:measure_battery_0@red [2-3]\d+:measure_battery_25@orange [4-6]\d+:measure_battery_50@green [7-8]\d+:measure_battery_75@green (9\d+|100).*:measure_battery_100@green
attr FindMy.AndreasiPhone stateFormat { my $s=ReadingsVal($name,"state","unknown");; my $b=ReadingsNum($name,"battery","-");; return "$b\n$s";; }