Modul für Nest Protect - Beta verfügbar

Begonnen von Mitch, 12 Mai 2017, 21:16:03

Vorheriges Thema - Nächstes Thema

Mitch

Danke, aber nein, das wars nicht, hatte ich auch schon probiert.

Es ist wie verteufelt, ich kann alle Daten aus dem JSON holen, nur diese verfluchte ID nicht  >:(
FHEM im Proxmox Container

Thorsten Pferdekaemper

Vielleicht so:

my $deviceid = (keys($result->{devices}{smoke_co_alarms}))[0];

...zumindest wenn es nur eine solche Device-Id gibt.
Gruß,
   Thorsten
FUIP

Mitch

dann kommt leider beim reload schon eine Fehlermeldung:
Experimental keys on scalar is now forbidden at ./FHEM/39.......
FHEM im Proxmox Container

Thorsten Pferdekaemper

Möglicherweise noch die Hash-Referenz explizit dereferenzieren:

my $deviceid = (keys(%{$result->{devices}{smoke_co_alarms}}))[0];
FUIP

Mitch

Du bist mein Held, Danke, es geht!!

Genial. Jetzt werde ich eine kleine Doku schreiben und das Modul hier posten.
FHEM im Proxmox Container

Mitch

#35
Edit: Es gibt eine neue Version ein paar Threads weiter!


So, mit großartige Hilfe von CoolTux, amenomade, dev0 und Thorsten Pferdekaemper habe ich es nun hinbekommen und möchter hier die erste Beta Version meines ersten Perl Moduls veröffentlichen, um einen Nest Protect auszulesen.
Vielen Dank für eure Hilfe und Gedult!

Das Modul einfach in den ./FHEM Ordner kopieren, evtl. Rechte anpassen und dann in fhem reload 39_nestprotect.pm eingeben.

Um das Modul zu nutzen, sind ein paar Dinge im Vorfeld durchzuführen:

1. Perl Module JSON, Time::HiRes und Enocde werden benötigt (falls noch nicht vorhanden, bitte installieren)
2. einen Developer Account bei Nest anlegen (developers.nest.com)
3. im Dev Account ein Produkt anlegen und Redirect URI leer lassen
4. Permissions auf Smoke+CO Alarm geben

Danach könnt ihr auf euer Produkt klicken und bekommt dort die Product ID, das Product Secret und die Authorization URL.
Die Product ID und das Product Secret brauchen wir später nochmal.

Jetzt muss man einen PIN kreieren, dazu einfach die Authorization URL im Browser eingeben.
Danach kommt eine Works with Nest Seite, dort bitte Annehmen klicken, danach wird der PIN angezeigt.

Nun kann man in fhem das Device anlegen: define NAME nestprotect PIN
Als nächstes bitte die zwei nötigen Attribute anlegen:
1. ProductID = Product ID von eurem Produkt auf der Developer Konsole
2. ProductSecret = Product Secret von eurem Produkt auf der Developer Konsole

Jetzt muss man sich mit set Token einen Token von der API holen.
Sobald der Token als Reading vorhanden ist, ist man mit der Konfig fertig.

Wer möchte, kann jetzt einfach ein get update machen und sollte nach einem kleinen Augenblick die Readings seines NestProtect erhalten.

Da ich noch keinen Interval eingebaut habe (obwohl es das Attribut gibt), legt das Modul einen at mit ($name.Poll) an, der alle 5 Minuten ein get update macht. Dies kann von jedem natürlich geändert werden und ist nur ein Workarround.

Als nächstes kann man sich z.B. einen DOIF oder notify einrichten, der auf die Events reagiert.
Es werden Events für online, last_seen, battery, co_status und smoke_status erzeugt.

Folgende Events sind möglich:

battery
ok   Battery level ok
replace   Battery level low, should be replaced

co_status
ok   Normal operation
warning   Detection of rising CO levels
emergency   CO levels too high, user should exit the home

smoke_status
ok   Normal operation
warning   Detection of rising smoke levels
emergency   Smoke levels too high, user should exit the home

online
1     NetsProtect ist online/hat Internet
0     NetsProtect ist offline/kein Internet


1. TODO: Interval einbauen und Update anhand Attribut triggern
2. TODO: den Code "säubern" und evtl. Fehler beheben
3. TODO: kommt bestimmt


Bitte testet das Modul und gebt mir Feedback.
Da mein erstes Modul ist und Perl und ich nicht wirklich Freunde (noch nicht), seit nicht zu streng mit mir  ;D

Update angehängt - html Docu eingefügt.
FHEM im Proxmox Container

amenomade

#36
Bravo :):)

Vorschlag zum 3. TODO: ProductSecret nicht in der .cfg speichern sondern irgendwo verschlüsselt. Siehe z.B. 72_FRITZBOX.pm
4. TODO: html Doku am Ende für CommandRef
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

kpl

Hallo Mitch,

erst mal danke für deine Mühe ein Modul für Nest Protect zu entwickeln.
Ich habe es bei mir jetzt mal zum Testen Installiert. Was mir bisher aufgefallen ist das es wohl noch nicht für mehrerer Devices ausgelegt ist, falls ich da nicht etwas übersehen habe.
Bei mir werden in den Readings mal der eine dann wieder ein anderer Melder angezeigt.
Es wäre schön, wenn du die Unterstützung für mehrere Devices noch mit in deine TODO Liste aufnehmen könntest.

Gruß,
Peter

Mitch

Hallo Peter,

nachdem ich (noch) nur einen Nest habe, habe ich das noch nicht getestet.

Könntest DU mir dazu bitte behilflich sein?

1. Bitte folgendes in fhem eingeben: {system ('curl -v -L -H "Content-Type: application/json" -H "Authorization: Bearer TOKEN" -X GET "https://developer-api.nest.com/"')}
Dabei TOKEN durch deinen echten TOKEN austauschen
2. die Ausgabe im Log (beginnend mit {"devices":{"smoke_co_alarms": bitte komplett kopieren und hier posten.

Vielen Dank!
FHEM im Proxmox Container

Thorsten Pferdekaemper

Hi,
das, was ich vorgeschlagen habe...:

my $deviceid = (keys(%{$result->{devices}{smoke_co_alarms}}))[0];

liest soweit ich verstehe die Id des "ersten" Geräts. Dummerweise ist dabei die Sortierung mehr oder weniger zufällig. Wahrscheinlich bekommst Du mit

my @devices = keys(%{$result->{devices}{smoke_co_alarms}});

...ein Array mit den Ids von allen Geräten (die in der aktuellen Message enthalten sind).
Gruß,
   Thorsten
FUIP

kpl

Hallo,

anbei das gewünschte log. Namen und Token wurden geändert.
{"devices":{"smoke_co_alarms":{"i3Q9WrnLuarTSAAuNRix3YQ5_ztseNbF":{"name":"Hallway (Mitte)","locale":"de-DE","structure_id":"26aEsMcxJ20UCFdBhEEh-SBjN3FgmKveyvDd-oAxsew5zdgR_NO81w","software_version":"3.1.2rc1","where_id":"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6RtLTHUNZ8-Ujg","device_id":"i3Q9WrnLuarTSAAuNRix3YQ5_ztseNbF","where_name":"Hallway","name_long":"Hallway Nest Protect (Mitte)","is_online":true,"last_connection":"2017-05-21T00:41:41.281Z","battery_health":"ok","co_alarm_state":"ok","smoke_alarm_state":"ok","ui_color_state":"green","is_manual_test_active":false,"last_manual_test_time":"2017-04-11T15:27:26.000Z"},"i3Q9WrnLuaqFnbtyiwe0loQ5_ztseNbF":{"name":"Kids Room (Jklyxcv)","locale":"en-US","structure_id":"26aEsMcxJ20UCFdBhEEh-SBjN3FgmKveyvDd-oAxsew5zdgR_NO81w","software_version":"3.1.2rc1","where_id":"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6Rv6EqumGp7RpA","device_id":"i3Q9WrnLuaqFnbtyiwe0loQ5_ztseNbF","where_name":"Kids Room","name_long":"Kids Room Nest Protect (Jklyxcv)","is_online":true,"last_connection":"2017-05-21T00:06:44.857Z","battery_health":"ok","co_alarm_state":"ok","smoke_alarm_state":"ok","ui_color_state":"green","is_manual_test_active":false,"last_manual_test_time":"2017-04-11T15:27:26.000Z"},"i3Q9WrnLuaqNs6aehSKhmIQ5_ztseNbF":{"locale":"de-DE","structure_id":"26aEsMcxJ20UCFdBhEEh-SBjN3FgmKveyvDd-oAxsew5zdgR_NO81w","software_version":"3.1.2rc1","where_id":"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6RtHHETzLKydlA","device_id":"i3Q9WrnLuaqNs6aehSKhmIQ5_ztseNbF","where_name":"Downstairs","name":"Downstairs","name_long":"Downstairs Nest Protect","is_online":true,"last_connection":"2017-05-21T00:22:03.780Z","battery_health":"ok","co_alarm_state":"ok","smoke_alarm_state":"ok","ui_color_state":"green","is_manual_test_active":false,"last_manual_test_time":"2017-04-11T15:27:07.000Z"},"i3Q9WrnLuapZVcf3bKa-f4Q5_ztseNbF":{"name":"Kids Room (Asdfgh)","locale":"de-DE","structure_id":"26aEsMcxJ20UCFdBhEEh-SBjN3FgmKveyvDd-oAxsew5zdgR_NO81w","software_version":"3.1.2rc1","where_id":"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6Rv6EqumGp7RpA","device_id":"i3Q9WrnLuapZVcf3bKa-f4Q5_ztseNbF","where_name":"Kids Room","name_long":"Kids Room Nest Protect (Asdfgh)","is_online":true,"last_connection":"2017-05-21T09:30:18.631Z","battery_health":"ok","co_alarm_state":"ok","smoke_alarm_state":"ok","ui_color_state":"green","is_manual_test_active":false,"last_manual_test_time":"2017-04-11T15:27:26.000Z"},"i3Q9WrnLuarEMNRfkC1YJ4Q5_ztseNbF":{"name":"Bedroom","locale":"de-DE","structure_id":"26aEsMcxJ20UCFdBhEEh-SBjN3FgmKveyvDd-oAxsew5zdgR_NO81w","software_version":"3.1.2rc1","where_id":"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6Rv72ZVhXryWmQ","device_id":"i3Q9WrnLuarEMNRfkC1YJ4Q5_ztseNbF","where_name":"Bedroom","name_long":"Bedroom Nest Protect","is_online":true,"last_connection":"2017-05-21T00:01:28.380Z","battery_health":"ok","co_alarm_state":"ok","smoke_alarm_state":"ok","ui_color_state":"green","is_manual_test_active":false,"last_manual_test_time":"2017-04-11T15:27:26.000Z"},"i3Q9WrnLuaqtIkUElLM01YQ5_ztseNbF":{"name":"Hallway (Oben)","locale":"de-DE","structure_id":"26aEsMcxJ20UCFdBhEEh-SBjN3FgmKveyvDd-oAxsew5zdgR_NO81w","software_version":"3.1.2rc1","where_id":"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6RtLTHUNZ8-Ujg","device_id":"i3Q9WrnLuaqtIkUElLM01YQ5_ztseNbF","where_name":"Hallway","name_long":"Hallway Nest Protect (Oben)","is_online":true,"last_connection":"2017-05-21T03:52:09.450Z","battery_health":"ok","co_alarm_state":"ok","smoke_alarm_state":"ok","ui_color_state":"green","is_manual_test_active":false,"last_manual_test_time":"2017-04-11T15:27:26.000Z"}}},"structures":{"26aEsMcxJ20UCFdBhEEh-SBjN3FgmKveyvDd-oAxsew5zdgR_NO81w":{"smoke_co_alarms":["i3Q9WrnLuaqtIkUElLM01YQ5_ztseNbF","i3Q9WrnLuarEMNRfkC1YJ4Q5_ztseNbF","i3Q9WrnLuapZVcf3bKa-f4Q5_ztseNbF","i3Q9WrnLuaqFnbtyiwe0loQ5_ztseNbF","i3Q9WrnLuaqNs6aehSKhmIQ5_ztseNbF","i3Q9WrnLuarTSAAuNRix3YQ5_ztseNbF"],"name":"Home","country_code":"DE","time_zone":"Europe/Berl100  6931  100  6931    0     0   4391      0  0:00:01  0:00:01 --:--:-- 10177o_alarm_state":"ok","smoke_alarm_state
* Closing connection 1
* SSLv3, TLS alert, Client hello (1):
} [data not shown]
":"ok","wheres":{"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6RuS9zLoOoYuyQ":{"where_id":"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6RuS9zLoOoYuyQ","name":"Backyard"},"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6RuSBG1reETGIw":{"where_id":"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6RuSBG1reETGIw","name":"Basement"},"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6Rv72ZVhXryWmQ":{"where_id":"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6Rv72ZVhXryWmQ","name":"Bedroom"},"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6RvSArzsAdr2fQ":{"where_id":"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6RvSArzsAdr2fQ","name":"Den"},"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6RubmyXmQ-hIfw":{"where_id":"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6RubmyXmQ-hIfw","name":"Dining Room"},"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6RtHHETzLKydlA":{"where_id":"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6RtHHETzLKydlA","name":"Downstairs"},"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6RsqYF6wACg-ZQ":{"where_id":"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6RsqYF6wACg-ZQ","name":"Driveway"},"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6RuDAuF5Ph-EwA":{"where_id":"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6RuDAuF5Ph-EwA","name":"Entryway"},"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6RtaOgB4ytHeww":{"where_id":"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6RtaOgB4ytHeww","name":"Family Room"},"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6Rv1G_-Ns8EYKQ":{"where_id":"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6Rv1G_-Ns8EYKQ","name":"Front Yard"},"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6RtLTHUNZ8-Ujg":{"where_id":"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6RtLTHUNZ8-Ujg","name":"Hallway"},"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6Rv6EqumGp7RpA":{"where_id":"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6Rv6EqumGp7RpA","name":"Kids Room"},"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6RsQYdWL7WAbwQ":{"where_id":"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6RsQYdWL7WAbwQ","name":"Kitchen"},"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6Rv1C-9IIanigw":{"where_id":"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6Rv1C-9IIanigw","name":"Living Room"},"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6RtXPdkhtA535A":{"where_id":"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6RtXPdkhtA535A","name":"Master Bedroom"},"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6Rv5TzBxN-XOBA":{"where_id":"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6Rv5TzBxN-XOBA","name":"Office"},"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6Rt7RoSrZ3eSWA":{"where_id":"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6Rt7RoSrZ3eSWA","name":"Outside"},"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6Ru-yoHhS-lZCQ":{"where_id":"nZa_SyyqAH-15lpeWpXjlTJ1tiYaPaqKt7z_O1Sv6Ru-yoHhS-lZCQ","name":"Upstairs"}}}},"metadata":{"access_token":"c.XXXXXXXXXXXXXXXXXXXXXXXXXXXX","client_version":1}}

Mitch

Danke.

Kann es sein, dass Du 6 Stück hast?

@Thorsten, Danke, das schau ich mir an
FHEM im Proxmox Container

kpl

Gern geschehen. Deine Erkenntnis ist richtig, ich habe 6 Stück.

Mitch

Ich bin echt am verzweifeln.
Ich habe jetzt netto 40 Stunden versucht dieses blöde JSON (welches wohl kein "echtes" ist) zu decodieren.

Problem ist wohl die Struktur.
Eine Validierung im Web z.B. ergibt: Expecting comma or }, & Invalid characters found.
Auch das HTTPMOD Modul kann es nicht als JSON erkennen.

Ich habe jetzt schon versucht, die Daten zu splitten, allerdings ergibt das dann natürlich keine Logic.

Ich komme im Moment echt nicht weiter und würde mich freuen, ween ich hier Unterstützung bekäme.
FHEM im Proxmox Container

CoolTux

Zeige mal bitte so einen JSON String.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net