Autor Thema: Modul für Nest Protect - Beta verfügbar  (Gelesen 1203 mal)

Offline Mitch

  • Hero Member
  • *****
  • Beiträge: 1940
  • Give more - Expect less
Antw:Modul für Nest Protect
« Antwort #15 am: 17 Mai 2017, 10:51:59 »
Danke Dir!

Ich muß schon sagen, es macht (leider) schon Spaß. Erinnert mich an damals, als ich Basic, dann Pascal und Assembler lernen mußte.
Am Anfang echt haarig, aber dann hat es immer Spaß gemacht.

Ist halt immer ein Zeitproblem....fhem...Familie...Arbeit....

Aber mal sehen, wieviele Module ich in Zukunft schreiben werde  ;D
FHEM auf Intel NUC mit Ubuntu Server, CUNOv2 - FHZ1300 - FritzDECT - 2x HM-LAN - Z-Wave - SIGNALduino@433 - SIGNALduino@868 - Homebridge - Alexa - Nest Protect
RaspberryPi als Room Node per FHEM2FHEM

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 8270
  • fhem.cfg befreite Zone!
Antw:Modul für Nest Protect
« Antwort #16 am: 17 Mai 2017, 10:56:53 »
Ist halt immer ein Zeitproblem....fhem...Familie...Arbeit....

Die Prioritäten gefallen mir. Lach
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.me/MOldenburg
Mein GitHub: https://github.com/LeonGaultier
Gefällt mir Gefällt mir x 1 Liste anzeigen

Offline Mitch

  • Hero Member
  • *****
  • Beiträge: 1940
  • Give more - Expect less
Antw:Modul für Nest Protect
« Antwort #17 am: 17 Mai 2017, 10:59:59 »
Meine Frau und meine Kinder sehen das anders  ;)
FHEM auf Intel NUC mit Ubuntu Server, CUNOv2 - FHZ1300 - FritzDECT - 2x HM-LAN - Z-Wave - SIGNALduino@433 - SIGNALduino@868 - Homebridge - Alexa - Nest Protect
RaspberryPi als Room Node per FHEM2FHEM

Offline Mitch

  • Hero Member
  • *****
  • Beiträge: 1940
  • Give more - Expect less
Antw:Modul für Nest Protect
« Antwort #18 am: 18 Mai 2017, 15:56:01 »
Habe gerade eine großen Rückschritt  :P

Habe das Modul komplett umgebaut, um die PIN Anfrage rein zubekommen und es zu "verallgemeinern".

Irgendwie mag Perl/fhem aber meine Variablen nicht und ich komme nicht drauf, weil alle mit my $variable = "irgendwas" deklariert sind.
Ich komme nicht drauf und zerbreche mir jetzt seit 2 Tagen den Kopf.
Habe den Code "zerpflügt" und versucht Stück für Stück aufzubauen, bekomme dann aber immer wieder Fehler, die ich mir nicht erklären kann.

Wenn ich die ganze pm (siehe Anhang) einlese, kommt im Moment eine lange Fehlermeldung:
syntax error at ./FHEM/39_testprotect.pm line 144, near "Log3 " Global symbol "$tokenrequest" requires explicit package name (did you forget to declare "my $tokenrequest"?) at ./FHEM/39_testprotect.pm line 146. syntax error at ./FHEM/39_testprotect.pm line 194, near "Log3 " Global symbol "$result" requires explicit package name (did you forget to declare "my $result"?) at ./FHEM/39_testprotect.pm line 197. Global symbol "$deviceid" requires explicit package name (did you forget to declare "my $deviceid"?) at ./FHEM/39_testprotect.pm line 197. Global symbol "$result" requires explicit package name (did you forget to declare "my $result"?) at ./FHEM/39_testprotect.pm line 198. Global symbol "$result" requires explicit package name (did you forget to declare "my $result"?) at ./FHEM/39_testprotect.pm line 199. Global symbol "$result" requires explicit package name (did you forget to declare "my $result"?) at ./FHEM/39_testprotect.pm line 200. Global symbol "$result" requires explicit package name (did you forget to declare "my $result"?) at ./FHEM/39_testprotect.pm line 201. Global symbol "$result" requires explicit package name (did you forget to declare "my $result"?) at ./FHEM/39_testprotect.pm line 202. Global symbol "$result" requires explicit package name (did you forget to declare "my $result"?) at ./FHEM/39_testprotect.pm line 203. Global symbol "$name" requires explicit package name (did you forget to declare "my $name"?) at ./FHEM/39_testprotect.pm line 205. Global symbol "$hash" requires explicit package name (did you forget to declare "my $hash"?) at ./FHEM/39_testprotect.pm line 216. Global symbol "$hash" requires explicit package name (did you forget to declare "my $hash"?) at ./FHEM/39_testprotect.pm line 218. Global symbol "$nestname" requires explicit package name (did you forget to declare "my $nestname"?) at ./FHEM/39_testprotect.pm line 218. Global symbol "$hash" requires explicit package name (did you forget to declare "my $hash"?) at ./FHEM/39_testprotect.pm line 219. Global symbol "$hash" requires explicit package name (did you forget to declare "my $hash"?) at ./FHEM/39_testprotect.pm line 220. Global symbol "$hash" requires explicit package name (did you forget to declare "my $hash"?) at ./FHEM/39_testprotect.pm line 221. Global symbol "$hash" requires explicit package name (did you forget to declare "my $hash"?) at ./FHEM/39_testprotect.pm line 222. Global symbol "$hash" requires explicit package name (did you forget to declare "my $hash"?) at ./FHEM/39_testprotect.pm line 223. Global symbol "$hash" requires explicit package name (did you forget to declare "my $hash"?) at ./FHEM/39_testprotect.pm line 224. Global symbol "$hash" requires explicit package name (did you forget to declare "my $hash"?) at ./FHEM/39_testprotect.pm line 225. Global symbol "$hash" requires explicit package name (did you forget to declare "my $hash"?) at ./FHEM/39_testprotect.pm line 227. Global symbol "$hash" requires explicit package name (did you forget to declare "my $hash"?) at ./FHEM/39_testprotect.pm line 230. Global symbol "$hash" requires explicit package name (did you forget to declare "my $hash"?) at ./FHEM/39_testprotect.pm line 232. Global symbol "$hash" requires explicit package name (did you forget to declare "my $hash"?) at ./FHEM/39_testprotect.pm line 235. Global symbol "$hash" requires explicit package name (did you forget to declare "my $hash"?) at ./FHEM/39_testprotect.pm line 236. Global symbol "$hash" requires explicit package name (did you forget to declare "my $hash"?) at ./FHEM/39_testprotect.pm line 236. syntax error at ./FHEM/39_testprotect.pm line 240, near "}" ./FHEM/39_testprotect.pm has too many errors.
Wenn ich jetzt nur die ersten zwei nehme:
1. line 144: Log3 $name, 5, "token requested"; -> in meinen Augen passt das
2. line 146: my $tokentask = qx($tokenrequest); -> auch hier stimmt das doch. mit dem my $tokentask wird die Variable deklariert?

Ich check es gerade nicht. Vielleicht kann mal jemand kurz drüber fliegen, evtl. ist es ja nur ein kleiner Denkfehler.

FHEM auf Intel NUC mit Ubuntu Server, CUNOv2 - FHZ1300 - FritzDECT - 2x HM-LAN - Z-Wave - SIGNALduino@433 - SIGNALduino@868 - Homebridge - Alexa - Nest Protect
RaspberryPi als Room Node per FHEM2FHEM

Offline amenomade

  • Full Member
  • ***
  • Beiträge: 302
Antw:Modul für Nest Protect
« Antwort #19 am: 18 Mai 2017, 16:44:25 »
Zeile 142: fehlt kein ";" ? Was mich dazu bringt ist, dass er wegen "$tokenrequest neben" Log3 schimpft.

EDIT: ebenso Zeile 192 194
« Letzte Änderung: 18 Mai 2017, 16:46:36 von amenomade »
FHEM 5.8 Pi 3, EchoDot, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, und HM Komponenten

F:"Schatz? Mach aus bitte"
M: "Alexa? Licht aus"-"Ich bin mir leider nicht sicher"  M:"Alexa? aus Licht"-"Das weiss ich leider nicht" M:"Alexa? Schalte...
F: "Drück mal auf den blöden Knopf!

Offline Mitch

  • Hero Member
  • *****
  • Beiträge: 1940
  • Give more - Expect less
Antw:Modul für Nest Protect
« Antwort #20 am: 18 Mai 2017, 16:52:58 »
Oh mann, Danke, ich wußte es ist irgendeine Kleinigkeit.  :-[

Jetzt "frießt" fhem die pm.
FHEM auf Intel NUC mit Ubuntu Server, CUNOv2 - FHZ1300 - FritzDECT - 2x HM-LAN - Z-Wave - SIGNALduino@433 - SIGNALduino@868 - Homebridge - Alexa - Nest Protect
RaspberryPi als Room Node per FHEM2FHEM
Gefällt mir Gefällt mir x 1 Liste anzeigen

Offline Mitch

  • Hero Member
  • *****
  • Beiträge: 1940
  • Give more - Expect less
Antw:Modul für Nest Protect
« Antwort #21 am: 19 Mai 2017, 00:25:59 »
nochmal eine (blöde) Frage.

Warum wird hier
sub
nestprotect_Get($$@)
{
  my ($hash, $name, $cmd) = @_;

  my $list = "token:noArg update:noArg";
 
  if( $cmd eq 'update' ) {
     nestprotect_Update();
  } elsif ( $cmd eq 'token') {
     nestprotect_Token();
  }

  return "Unknown argument $cmd, choose one of $list";
}
nie update oder token ausgeführt, sondern kommt immer die Fehlermeldung "Unknown argument token, , choose one of token:noArg update:noArg"?

Vielen Dank!
FHEM auf Intel NUC mit Ubuntu Server, CUNOv2 - FHZ1300 - FritzDECT - 2x HM-LAN - Z-Wave - SIGNALduino@433 - SIGNALduino@868 - Homebridge - Alexa - Nest Protect
RaspberryPi als Room Node per FHEM2FHEM

Offline amenomade

  • Full Member
  • ***
  • Beiträge: 302
Antw:Modul für Nest Protect
« Antwort #22 am: 19 Mai 2017, 10:08:04 »
Weil Du in $cmd ein Array bekommst, da dein Prototyp ($$@) heisst.

sub nestprotect_Get($$@)erwartet als Parameter
- ein String
- ein String
- ein Array

Dann mit
my ($hash, $name, $cmd) = @_;kriegst Du in $cmd als Array alle restliche Parameter. Beispiel von einem Call:
$r = nestprotect_Get("hash xyz", "myParameter1", "subvalue to get", "default value", "timeout");
my ($hash, $name, $cmd) = @_;
Ergebnis:
$hash= hash
$name = "myParameter1"
$cmd = ("subvalue to get", "default value", "timeout")

Entweder brauchst Du doch zusätzliche Argumente, und machst so:
my ($hash, $name, $cmd, @args) = @_;
Oder willst Du einfach den Rest vergessen, und machst so:
my ($hash, $name, @a) = @_;
my $cmd = $a[0];

FHEM 5.8 Pi 3, EchoDot, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, und HM Komponenten

F:"Schatz? Mach aus bitte"
M: "Alexa? Licht aus"-"Ich bin mir leider nicht sicher"  M:"Alexa? aus Licht"-"Das weiss ich leider nicht" M:"Alexa? Schalte...
F: "Drück mal auf den blöden Knopf!

Offline Mitch

  • Hero Member
  • *****
  • Beiträge: 1940
  • Give more - Expect less
Antw:Modul für Nest Protect
« Antwort #23 am: 19 Mai 2017, 12:30:14 »
Irgendwie stehe ich gerade auf dem Schlauch  :-[

Ich habe ja keine "Argumente".

Ich möchte einfach
get $name $cmdschicken, also z.B. get netsprotect token
also
my ($hash, $name, $cmd) = @_;
Dein Tip
Zitat
Entweder brauchst Du doch zusätzliche Argumente, und machst so:
my ($hash, $name, $cmd, @args) = @_;
hat leider auch nicht funktioniert.

Ich habe mich an das Wiki gehalten.

In meiner jetzigen Version 1 geht das auch ohne $args:
sub
nestprotect_Set($$@)
{
  my ($hash, $name, $cmd) = @_;
  my $token = $hash->{TOKEN};

  my $list = "update";

  if( $cmd eq 'update' ) {.....}

Auch in anderen Modulen, die ich mir angeschaut habe (z.B. mailcheck oder alex) geht das so wie ich es gemacht habe?

Sorry, wenn ich mich blöd anstelle, aber ich bin noch am lernen   :P
« Letzte Änderung: 19 Mai 2017, 12:33:06 von Mitch »
FHEM auf Intel NUC mit Ubuntu Server, CUNOv2 - FHZ1300 - FritzDECT - 2x HM-LAN - Z-Wave - SIGNALduino@433 - SIGNALduino@868 - Homebridge - Alexa - Nest Protect
RaspberryPi als Room Node per FHEM2FHEM

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 8270
  • fhem.cfg befreite Zone!
Antw:Modul für Nest Protect
« Antwort #24 am: 19 Mai 2017, 12:42:10 »
Mitch überlege mal was genau Dein Problem gerade ist.

Du willst Brüste sehen und hast ne Wand vor der Nase. Bohre doch einfach erstmal ein Loch in die Wand.
Auf gut Deutsch, baue Dir Debugausgaben ein und schaue was tatsächlich als $cmd an kommt.
printf $cmd;
Oder wegen meiner auch Log3 für die Ausgabe.
Somit siehst du erstmal was und kannst natürlich dann darauf reagieren.

Grüße
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.me/MOldenburg
Mein GitHub: https://github.com/LeonGaultier

Offline Mitch

  • Hero Member
  • *****
  • Beiträge: 1940
  • Give more - Expect less
Antw:Modul für Nest Protect
« Antwort #25 am: 19 Mai 2017, 12:51:18 »
Sehr schöner Vergleich...Brüste finde ich gut  ;D

Aber ich war mal wieder zu schnell mit den Fragen und habe es selber hinbekommen.

Das mit dem Debug ist ne super Idee, das bau ich heute nich ein.
Oh mann, bis jetzt sind Perl und ich keine Freunde  ;D
FHEM auf Intel NUC mit Ubuntu Server, CUNOv2 - FHZ1300 - FritzDECT - 2x HM-LAN - Z-Wave - SIGNALduino@433 - SIGNALduino@868 - Homebridge - Alexa - Nest Protect
RaspberryPi als Room Node per FHEM2FHEM

Offline amenomade

  • Full Member
  • ***
  • Beiträge: 302
Antw:Modul für Nest Protect
« Antwort #26 am: 19 Mai 2017, 13:04:13 »
Und was war die Lösung?
FHEM 5.8 Pi 3, EchoDot, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, und HM Komponenten

F:"Schatz? Mach aus bitte"
M: "Alexa? Licht aus"-"Ich bin mir leider nicht sicher"  M:"Alexa? aus Licht"-"Das weiss ich leider nicht" M:"Alexa? Schalte...
F: "Drück mal auf den blöden Knopf!

Offline amenomade

  • Full Member
  • ***
  • Beiträge: 302
Antw:Modul für Nest Protect
« Antwort #27 am: 19 Mai 2017, 13:27:08 »
Funktioniert m.A. nur, so lange keiner die Idee hat, die Sub mit mehr als 3 Parameter zu rufen. Dann ok, in dem Fall $cmd=@cmd[0]

Aber ich bin kein Expert.

Mir fällt gerade was ein: so wie deine Funktion aussieht, wirst Du IMMER den Nachricht "Unknown argument" bekommen, egal ob er was gemacht hat oder nicht.

FHEM 5.8 Pi 3, EchoDot, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, und HM Komponenten

F:"Schatz? Mach aus bitte"
M: "Alexa? Licht aus"-"Ich bin mir leider nicht sicher"  M:"Alexa? aus Licht"-"Das weiss ich leider nicht" M:"Alexa? Schalte...
F: "Drück mal auf den blöden Knopf!

Offline Mitch

  • Hero Member
  • *****
  • Beiträge: 1940
  • Give more - Expect less
Antw:Modul für Nest Protect
« Antwort #28 am: 19 Mai 2017, 17:55:22 »
Danke euch.
Der Fehler lag nicht an der sub selber (wobei der Einwand von amenomade wohl stimmt), sonder wie ich diese aufgerufen habe.

Im Prinzip ist das Modul jetzt als Beta fertig.

Eine Kleinigkeit habe ich noch, die ich nicht weg bekommen (den Workarround möchte ich hier nicht anbieten).
Wenn ich da nochmal etwas Hilfe bekäme  :-[ wäre das Modul heute Abend fertig und zum Testen freigegeben.

Folgendes "Problemchen" habe ich noch:

die API liefer ja ein JSON zurück, welches ich decodieren und dann die einzelnen Teile einlesen und in Readings schreibe.
my $result = decode_json $output;
       
       Log3 $name, 5, "$output";

       my $nestname = $result->{devices}->{smoke_co_alarms}->{$deviceid}->{name};
       my $nestlocale = $result->{devices}->{smoke_co_alarms}->{$deviceid}->{locale};
       my $nestsoftware = $result->{devices}->{smoke_co_alarms}->{$deviceid}->{software_version};
       my $nestisonline = $result->{devices}->{smoke_co_alarms}->{$deviceid}->{is_online};
       my $nestconection = $result->{devices}->{smoke_co_alarms}->{$deviceid}->{last_connection};
       my $nestbattery = $result->{devices}->{smoke_co_alarms}->{$deviceid}->{battery_health};
       my $nestco = $result->{devices}->{smoke_co_alarms}->{$deviceid}->{co_alarm_state};
       my $nestsmoke = $result->{devices}->{smoke_co_alarms}->{$deviceid}->{smoke_alarm_state};

       Log3 $name, 3, "nestprotect update done";

       # my $reading1 = "Hash";
        my $reading2 = "name";
        my $reading3 = "language";
        my $reading4 = "softwareversion";
        my $reading5 = "online";
        my $reading6 = "last_seen";
        my $reading7 = "battery";
        my $reading8 = "co_status";
        my $reading9 = "smoke_status";

        readingsBeginUpdate($hash);
       
        #readingsBulkUpdate($hash, $reading1, $result);
        readingsBulkUpdate($hash, $reading2, $nestname);
        readingsBulkUpdate($hash, $reading3, $nestlocale);
        readingsBulkUpdate($hash, $reading4, $nestsoftware);
        readingsBulkUpdate($hash, $reading5, $nestisonline);
        readingsBulkUpdate($hash, $reading6, $nestconection);
        readingsBulkUpdate($hash, $reading7, $nestbattery);
        readingsBulkUpdate($hash, $reading8, $nestco);
        readingsBulkUpdate($hash, $reading9, $nestsmoke);
       
        readingsEndUpdate($hash, 1);

dabei kommt die Variable $deviceid aus einem Attribut.
Das ganze funktioniert ohne Probleme.

Da aber jeder eine andere Device ID hat, möchte ich diese auch erst auslesen und dann verenden.

Aus irgend einem Grund, der mir nicht ersichtlich ist, kann ich die Device ID nicht aus dem JSON "rausholen".

So wäre der Code:
my $result = decode_json ($output);
       
       Log3 $name, 5, "$output";
       
       my $deviceid = $result->{devices}->{smoke_co_alarms};
       
       readingsSingleUpdate($hash, "device_id", $deviceid, 0);
       
       Log3 $name, 5, "device id fuer $name lautet $deviceid";

Leider bekomme ich immer als Device ID den Hash (z.B. HASH(0x2121212121) )

Der Aufbau des JSON wäre folgender, wobei an der Stelle von xxxxxxxxxxxx die echte Device ID steht:
{"devices":{"smoke_co_alarms":{"xxxxxxxxxxxx":{"name":"Living Room","locale":"de-DE","structure_id":"cAGFUR8BWMnKqvGZJbvkZ1yfb7LDqRqiKoYh_oAUtUBO6A3lfyA00g","software_version":"3.1.2rc1","where_id":"x-temEyTZjFyNsR7u-mlevey9slX8u0rcFnLz8vLFvIVxTsdicxhmw","device_id":"xxxxxxxxxxxx","where_name":"Living Room","name_long":"Living Room Nest Protect","is_online":true,"last_connection":"2017-05-10T16:44:08.419Z","battery_health":"ok","co_alarm_state":"ok","smoke_alarm_state":"ok","ui_color_state":"green","is_manual_test_active":false}}},"structures":{"cAGFUR8BWMnKqvGZJbvkZ1yfb7LDqRqiKoYh_oAUtUBO6A3lfyA00g":{"smoke_co_alarms":["EcGWQj0ttd81RSC0ZyyUvji38A4Bj6n8"],"name":"Zweigstrasse","country_code":"DE","time_zone":"Europe/Berlin","structure_id":"cAGFUR8BWMnKqvGZJbvkZ1yfb7LDqRqiKoYh_oAUtUBO6A3lfyA00g","co_alarm_state":"ok","smoke_alarm_state":"ok","wheres":{"x-temEyTZjFyNsR7u-mlevey9slX8u0rcFnLz8vLFvJDa8Oc0DXjVA":{"where_id":"x-temEyTZjFyNsR7u-mlevey9slX8u0rcFnLz8vLFvJDa8Oc0DXjVA","name":"Backyard"},"x-temEyTZjFyNsR7u-mlevey9slX8u0rcFnLz8vLFvLCFiB8N_58aA":{"where_id":"x-temEyTZjFyNsR7u-mlevey9slX8u0rcFnLz8vLFvLCFiB8N_58aA","name":"Basement"},"x-temEyTZjFyNsR7u-mlevey9slX8u0rcFnLz8vLFvJesGvetXrhpw":{"where_id":"x-temEyTZjFyNsR7u-mlevey9slX8u0rcFnLz8vLFvJesGvetXrhpw","name":"Bedroom"},"x-temEyTZjFyNsR7u-mlevey9slX8u0rcFnLz8vLFvKEKZWtwvMEbA":{"where_id":"x-temEyTZjFyNsR7u-mlevey9slX8u0rcFnLz8vLFvKEKZWtwvMEbA","name":"Den"},"x-temEyTZjFyNsR7u-mlevey9slX8u0rcFnLz8vLFvJSQ_DmLkBZ0g":{"where_id":"x-temEyTZjFyNsR7u-mlevey9slX8u0rcFnLz8vLFvJSQ_DmLkBZ0g","name":"Dining Room"},"x-temEyTZjFyNsR7u-mlevey9slX8u0rcFnLz8vLFvLkCJj2If5Cgg":{"where_id":"x-temEyTZjFyNsR7u-mlevey9slX8u0rcFnLz8vLFvLkCJj2If5Cgg","name":"Downstairs"},"x-temEyTZjFyNsR7u-mlevey9slX8u0rcFnLz8vLFvLsphSlBV5SNg":{"where_id":"x-temEyTZjFyNsR7u-mlevey9slX8u0rcFnLz8vLFvLsphSlBV5SNg","name":"Driveway"},"x-temEyTZjFyNsR7u-mlevey9slX8u0rcFnLz8vLFvL0QAyCdyzugQ":
FHEM auf Intel NUC mit Ubuntu Server, CUNOv2 - FHZ1300 - FritzDECT - 2x HM-LAN - Z-Wave - SIGNALduino@433 - SIGNALduino@868 - Homebridge - Alexa - Nest Protect
RaspberryPi als Room Node per FHEM2FHEM

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 8270
  • fhem.cfg befreite Zone!
Antw:Modul für Nest Protect
« Antwort #29 am: 19 Mai 2017, 19:24:16 »
my $deviceid = $result->{devices}{smoke_co_alarms};
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.me/MOldenburg
Mein GitHub: https://github.com/LeonGaultier