Modul für Nest Protect - Beta verfügbar

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

Vorheriges Thema - Nächstes Thema

Mitch

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 im Proxmox Container

CoolTux

Zitat von: Mitch am 17 Mai 2017, 10:51:59
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.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Mitch

Meine Frau und meine Kinder sehen das anders  ;)
FHEM im Proxmox Container

Mitch

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 im Proxmox Container

amenomade

#19
Zeile 142: fehlt kein ";" ? Was mich dazu bringt ist, dass er wegen "$tokenrequest neben" Log3 schimpft.

EDIT: ebenso Zeile 192 194
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Mitch

Oh mann, Danke, ich wußte es ist irgendeine Kleinigkeit.  :-[

Jetzt "frießt" fhem die pm.
FHEM im Proxmox Container

Mitch

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 im Proxmox Container

amenomade

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];


Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Mitch

#23
Irgendwie stehe ich gerade auf dem Schlauch  :-[

Ich habe ja keine "Argumente".

Ich möchte einfach
get $name $cmd
schicken, also z.B. get netsprotect token
also
my ($hash, $name, $cmd) = @_;

Dein Tip
ZitatEntweder 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
FHEM im Proxmox Container

CoolTux

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.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Mitch

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 im Proxmox Container

amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

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.

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Mitch

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 im Proxmox Container

CoolTux


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.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net