openHAB 2.2 iCloud Präsenzerkennung

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
Cyrelian
Beiträge: 601
Registriert: 24. Sep 2015 17:55
Answers: 4

openHAB 2.2 iCloud Präsenzerkennung

Beitrag von Cyrelian »

Hallo zusammen,

nach dem wir das Thema Präsenzerkennung via WLAN und IFTTT ja hier im Forum schon ausführlich behandelt haben, gibt es seit openHAB 2.2 noch eine sehr interessante Möglichkeit sein iPhone zu orten und damit eine Präsenzerkennung abzubilden.

Das neue iCloud-Binding.

Mir kommt es bei der Präsenzerkennung auf zwei Dinge an. Einmal eine gewisse Trägheit, damit das iPhone auch Nachts mal aus sein kann und es trotzdem "zu Hause" angezeigt wird und zum anderen die Geschwindigkeit über die WLAN Präsenzerkennung. Ein weiterer Aspekt ist, dass ich auf allen iPhones die IFTTT-App installieren musste und entsprechende Accounts bei IFTTT anlegen musste. Das ist natürlich von der administrativen Seite her immer recht aufwändig.
Aus diesem Grund kam mir das iCloud-Binding gerade recht. Wer mehr als ein iPhone im Haus hat, sollte sich umbedingt die Familienfreigabe von Apple anschauen. Wenn alle Apple-ID´s in der Familienfreigabe sind, reicht nachher der Hauptaccount(Organisator) aus, damit das iCloud-Binding ALLE iPhones der Familie findet.

So, aber jetzt mal zu dem, was Euch wirklich interessiert :D :

ITEMS:

Code: Alles auswählen

Group       gCyreliansiPhone                     "Cyrelian´s iPhone"                                <iphone>
String      CyreliansiPhone_BatteryStatus        "Batteriestatus [%s]"                             <iphone>        (giCloud,gCyreliansiPhone) {channel="icloud:device:iCloud:cf25XXXX:batteryStatus"}
Number      CyreliansiPhone_BatteryLevel         "Batterie Level [%.0f %%]"                         <battery>       (giCloud,gCyreliansiPhone) {channel="icloud:device:iCloud:cf25XXXX:batteryLevel"}
Switch      CyreliansiPhone_FindMyPhone          "Find My iPhone"                                   <find_iphone>   (giCloud,gCyreliansiPhone) {channel="icloud:device:iCloud:cf25XXXX:findMyPhone"}
Location    CyreliansiPhone_Coordinates          "iPhone Koordinaten"                                               (giCloud,gCyreliansiPhone) {channel="icloud:device:iCloud:cf25XXXX:location"}
Number      CyreliansiPhone_LocationAccuracy     "Standortgenauigkeit [%.0f m]"                    <accuracy>      (giCloud,gCyreliansiPhone) {channel="icloud:device:iCloud:cf25XXXX:locationAccuracy"}
DateTime    CyreliansiPhone_LocationLastUpdate   "Letztes Update [%1$td.%1$tm.%1$tY, %1$tH:%1$tM]"  <time>          (giCloud,gCyreliansiPhone) {channel="icloud:device:iCloud:cf25XXXX:locationLastUpdate"}
String      CyreliansiPhone_Location             "Standort [%s]"                                    <suitcase>      (giCloud,gCyreliansiPhone)
String      CyreliansiPhone_Location_Address     "Aktueller Standort [%s]"                          <map>           (giCloud,gCyreliansiPhone)
RULES:

Code: Alles auswählen

import org.eclipse.xtext.xbase.lib.Functions

val String filename = "icloud.rules"
//API key for Google Maps API
val String GoogleAPIKey = "yourGoogleAPIKey"

//my home location
val PointType home = new PointType(new DecimalType(50.XXXXXXXXX), new DecimalType(7.XXXXXXXXX))

//my work location
val PointType work = new PointType(new DecimalType(50.XXXXXXXXX), new DecimalType(7.XXXXXXXXX))

// Function to transform location coordinates to address
val Functions$Function1<GenericItem, String> locationAddress= [ Coordinates |
	val geocodeURL = "https://maps.googleapis.com/maps/api/geocode/json?key=XXXXXXXXXXXXXXXXXXXXXXXXXXX&latlng=" + Coordinates.state.toString + "&language=german&sensor=true"
	val String geocodeJson = sendHttpGetRequest(geocodeURL)
	var String formattedAddress = transform("JSONPATH", "$.results[0].formatted_address", geocodeJson)
	formattedAddress = formattedAddress.replace(", Germany", "")
	return formattedAddress
]
// Function called to calculate location distance
val Functions$Function4<GenericItem, PointType, String, Number, String> locationDistance= [ Coordinates, place, placeName, distance2 |
	val PointType location = Coordinates.state as PointType
	var int distance
	var String message
	// my home location
	distance = location.distanceFrom(place).intValue()
	    if (distance < distance2) {
	    message = (String::format("%s (%dm) - %s", placeName, distance, "Home Sweet Home"))
	  } else {
	    message = "unterwegs"
	    }
	 return message
]


rule "Standortbestimmung: Cyrelian´s iPhone"
when
    Item CyreliansiPhone_Coordinates changed
    //Time cron  "0/30 * * * * ?"
then
    logInfo(filename, "Standortbestimmung: Cyrelian´s iPhone")
    CyreliansiPhone_Location.postUpdate(locationDistance.apply(CyreliansiPhone_Coordinates, home, "zu Hause", 125))
    CyreliansiPhone_Location_Address.postUpdate(locationAddress.apply(CyreliansiPhone_Coordinates))
end


rule "Cyrelian Presence Update"
   when
		Item MOBCyrelians_WLAN changed or
		//Item MOBCyrelians_IFTTT changed or
		Item CyreliansiPhone_Location changed or
		System started
   then
      	if (MOBCyrelians_WLAN.state == "Anwesend" || CyrelianssiPhone_Location.state.toString != "unterwegs"){
      		logInfo(filename, "Cyrelian ist Zuhause")
      		MOBCyrelian.postUpdate(ON)
      	}
      	else {
      		logInfo(filename, "Cyrelian ist nicht Zuhause")
      		MOBCyrelian.postUpdate(OFF)	
      	}
end
SITEMAP:

Code: Alles auswählen

Frame label="iCloud Devices" {
		Text item=gCyreliansiPhone label="Cyrelian´s iPhone" icon="iphone"{
			Frame item=gCyreliansiPhone {
				Text item=CyreliansiPhone_BatteryStatus
				Text item=CyreliansiPhone_BatteryLevel
				Text item=CyreliansiPhone_LocationAccuracy
				Text item=CyreliansiPhone_LocationLastUpdate
				Text item=CyreliansiPhone_Location
				Switch item=CyreliansiPhone_FindMyPhone mappings=[ON="Find"]
				Text item=CyreliansiPhone_Location_Address
				Mapview item=CyreliansiPhone_Coordinates height=8				
			}
		}
            }
Das ganze sieht dann so aus:
Bildschirmfoto 2018-01-03 um 13.43.47.png
und im Detail:
Bildschirmfoto 2018-01-04 um 17.38.36.png

Das ist natürlich nicht alles auf meinem Mist gewachsen. Als Vorlage dienten mir die ITEMS und Rules von "patrik_gfeller"Klick.

Die Hauptanpassungen habe ich in den Rules im Bereich der Lambda Funktionen vorgenommen.

Ich hoffe, dass hilft dem einen oder anderen von euch weiter ;)

CYA
Cyrelian
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

ThomyTP
Beiträge: 41
Registriert: 8. Jan 2018 19:13
Answers: 1

Re: openHAB 2.2 iCloud Präsenzerkennung

Beitrag von ThomyTP »

Hallo Cyrelian,
super coole Idee die Du hattest, das war auch mein erster Gedanke das nun die Anwesenheitserkennung auch bei IOS gut funktioniert.
Gesagt getan, schnell mal zu testenen Deinen Code probiert. Leider bekomme ich folgende Fehlermeldung im log.

2018-01-08 18:35:53.475 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'home.rules'

2018-01-08 18:35:53.491 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'home.rules' is either empty or cannot be parsed correctly!

2018-01-08 18:35:53.748 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'home.rules' has errors, therefore ignoring it: [251,1]: missing EOF at 'val'
.
.
.

2018-01-08 18:36:06.347 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'home.rules' has errors, therefore ignoring it: [249,1]: missing EOF at 'import'

Dies sind genau diese Zeilen:
import org.eclipse.xtext.xbase.lib.Functions

val String filename = "icloud.rules"

Hast Du eine Idee woran dies liegen mag? Muss ich für den Import noch was beachten?
Gruß
ThomyTP

ThomyTP
Beiträge: 41
Registriert: 8. Jan 2018 19:13
Answers: 1

Re: openHAB 2.2 iCloud Präsenzerkennung

Beitrag von ThomyTP »

Hallo noch mal,
Lösung gefunden, Declarationen müssen am Anfang der Rule hin,
schon geht es.. :-)

Kannst du noch ein paar Worte zu rule "Cyrelian Presence Update" geben? Was machst Du da mit deinem Wlan??
Danke + Gruß
ThomyTP

Benutzeravatar
Cyrelian
Beiträge: 601
Registriert: 24. Sep 2015 17:55
Answers: 4

openHAB 2.2 iCloud Präsenzerkennung

Beitrag von Cyrelian »

Hi ThomyTP,

cool das es jetzt läuft. Ja, die declarations müssen immer in den Anfang.

Für die Erkennung im Wlan benutze ich das exec Binding und führe auf der Kommandozeile ein hping3 aus, der die iPhones auch im „Ruhemode“ anpingen kann.
Schau mal hier hab ich das genau beschrieben, auch mit den shell Skripten.
viewtopic.php?f=16&t=137

Cu
Cyrelian

Hille
Beiträge: 49
Registriert: 2. Jan 2018 13:59
Answers: 0

Re: openHAB 2.2 iCloud Präsenzerkennung

Beitrag von Hille »

Ich habe das nun auch mal getestet, funktioniert soweit problemlos. Allerdings bekomme ich in der Gruppe z.B. iPhone_Hille die Map nicht angezeigt. Hier kommt die Fehlermeldung: "error_message" : "API keys with referer restrictions cannot be used with this API." Die Google API ist aber korrekt in der Rules vorhanden. Das Interessante ist, das die Map direkt in der Sitemap angezeigt wird. Der Standort (z.B. zu Hause) wird in der Gruppe ebenfalls angezeigt. Wo liegt mein Fehler?

Benutzeravatar
Cyrelian
Beiträge: 601
Registriert: 24. Sep 2015 17:55
Answers: 4

Re: openHAB 2.2 iCloud Präsenzerkennung

Beitrag von Cyrelian »

Hi Hille,

scheint als hättest Du den API Key noch nicht von seiner Beschränkung "befreit"

https://console.developers.google.com
api.JPG
Cu
Cyrelian
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Hille
Beiträge: 49
Registriert: 2. Jan 2018 13:59
Answers: 0

Re: openHAB 2.2 iCloud Präsenzerkennung

Beitrag von Hille »

Genau das war die Lösung, danke. Allerdings bekomme ich nun diese Ausgabe:

{ "results" : [ { "address_components" : [ { "long_name" : "50"

Im Quelltext kann ich aber die korrekte Adresse bzw Koordinaten erkennen.

ThomyTP
Beiträge: 41
Registriert: 8. Jan 2018 19:13
Answers: 1

Re: openHAB 2.2 iCloud Präsenzerkennung

Beitrag von ThomyTP »

Hallo,
Nun musst du noch die JSONPath Transformation installieren..
Dann geht es..
Gruß thomytp

ThomyTP
Beiträge: 41
Registriert: 8. Jan 2018 19:13
Answers: 1

Re: openHAB 2.2 iCloud Präsenzerkennung

Beitrag von ThomyTP »

Ach ja, cyrelian, schön wäre noch eine Erweiterung um folgende Features,

- Erkennung von diversen Standorten, z.b. Arbeit, Sport,...
- bei deaktivierten Handy oder kein Empfang , Statusmeldungen offline..

Dann wäre es wirklich eine perfekt Lösung für viele Fälle..
Gruss

Benutzeravatar
Cyrelian
Beiträge: 601
Registriert: 24. Sep 2015 17:55
Answers: 4

Re: openHAB 2.2 iCloud Präsenzerkennung

Beitrag von Cyrelian »

Hi Thomy,
- Erkennung von diversen Standorten, z.b. Arbeit, Sport,...
das kannst Du bereits mit:

Code: Alles auswählen

val PointType home = new PointType(new DecimalType(50.XXXXXXXXX), new DecimalType(7.XXXXXXXXX))
Einfach die verschiedenen Ort einzeln definieren.
Wichtig: Sie müssen eindeutig sein :!:

In der rule musst Du dann die einzelnen Orte aufrufen:

Code: Alles auswählen

CyreliansiPhone_LocationHome.postUpdate(locationDistance.apply(CyreliansiPhone_Coordinates, home, "zu Hause", 125))
CyreliansiPhone_LocationWork.postUpdate(locationDistance.apply(CyreliansiPhone_Coordinates, work, "Office", 125))
- bei deaktivierten Handy oder kein Empfang , Statusmeldungen offline..
Das, so wie ich das sehe, geht derzeit nur über einen kleinen Umweg:

Code: Alles auswählen

rule "iPhone offline"
when
    Item CyreliansiPhone_BatteryStatus changed from Charging to Unknown or
    Item CyreliansiPhone_BatteryStatus changed from "Not charging" to Unknown

then
    Item.postUpdate(offline)
end

CU
Cyrelian

Antworten