FHEM Forum

FHEM => Automatisierung => Thema gestartet von: moontear am 05 März 2017, 14:06:37

Titel: Mehere Eigenschaften eines Devices abholen mit einem Befehl?
Beitrag von: moontear am 05 März 2017, 14:06:37
Ich möchte von ein paar Devices ein paar Eigenschaften lesen via Perl: Reading State, Attribut Alias und noch ein Reading.

Ich könnte jetzt immer folgendes machen um meine drei Eigenschaften zu bekommen:

ReadingsNum("Licht_Flur","state","")
ReadingsNum("Licht_Flur","Reading1","")
AttrVal("Licht_Flur","Alias","")


Finde ich aber unschön, da es drei Calls sind - gibt es eine Methode/Möglichkeit wie ich mehrere Dinge abfragen kann?

Ich habe list und jsonlist2 gefunden, so kann ich per URL folgendes aufrufen: http://host:8083/fhem?cmd=list%20Licht_Flur%20state%20alias%20Reading1&xhr=1. Kann ich das auch in PERL verwenden, gibt es eine bessere Methode als per JSON? Die Commandref gibt hier leider kein gutes Beispiel, im Wiki finde ich gar nichts. Über den list-Command mehr zu finden als in der Commandref ist unmöglich weil der Name einfach zu generisch ist... Wie verwende ich list Licht_flur state alias Reading1 in Perl? Bekomme ich ein Associative Array zurück?
Titel: Antw:Mehere Eigenschaften eines Devices abholen mit einem Befehl?
Beitrag von: Benni am 05 März 2017, 14:35:35
Ich weiß ja nicht, was du vor hast. Schau dir mal jsonlist2 (http://fhem.de/commandref_DE.html#JsonList2) an.
Titel: Antw:Mehere Eigenschaften eines Devices abholen mit einem Befehl?
Beitrag von: moontear am 05 März 2017, 14:42:54
Kenne ich, siehe den Post.

Wie kann ich jsonlist2 / list aus Perl heraus verwenden? Wie arbeite ich mit den Werten? Ich sehe keine Beispiele in der commandref.
Titel: Antw:Mehere Eigenschaften eines Devices abholen mit einem Befehl?
Beitrag von: Benni am 05 März 2017, 14:44:32
Das geht mit Sicherheit auch in Perl und irgendwo im Forum wurde neulich auch eine relativ einfache Möglichkeit gezeigt, das json in einen Hash oder in ein Array zu bringen.

Wenn du aber sowieso über eine sub in der myUtlis gehst, könntest du natürlich auch direkt den Device-Hash auslesen (dazu bitte die Developer-Seiten im Wiki studieren!)
Titel: Antw:Mehere Eigenschaften eines Devices abholen mit einem Befehl?
Beitrag von: moontear am 05 März 2017, 14:51:56
"irgendwo im Forum" - bitte genauer. Gesucht habe ich, gefunden nichts  ;)

Device-Hash klingt sehr interessant, auch hier wäre super zu sehen wo im Wiki der verortet ist und ein Beispiel. Ich habe jetzt auf https://wiki.fhem.de/wiki/DevelopmentModuleIntro lediglich $hash->{NAME} gefunden, hash ist aber in der myUtils erstmal nicht initialisiert.

Also: Ich suche konkrete Beispielem mit Code. Gesucht habe ich bereits.

Aufgabenstellung: Ich möchte Attribut Alias, Reading state und Reading "Reading1" von meinem Gerät "Licht_Flur" in einem Array/Hash haben um damit weiterzuarbeiten.
Titel: Antw:Mehere Eigenschaften eines Devices abholen mit einem Befehl?
Beitrag von: Benni am 05 März 2017, 15:01:05
Den Hash zum Device müsstest du dir natürlich erst mal holen $defs{<devicename>}
Ich würde dir aber dennoch vorschlagen, erst mal bei ReadingsVal zu bleiben, das ist die, für User definierte Methode.

Wenn ich's genauer gehabt hätte, hätte ich den Link schon gepostet   ;)
Titel: Antw:Mehere Eigenschaften eines Devices abholen mit einem Befehl?
Beitrag von: moontear am 05 März 2017, 15:04:18
ReadingsVal ist aber eben nur für ein Value - ich möchte das ja relativ generisch halten. JsonList2 sieht super aus - wenn ich das per URL aufrufe (via LWP::Simple) und per json_decode decode bekomme ich auch ein Associative Array (Hash) zurück. Über URL ist aber Umweg wenn ich sowieso in PERL bin und wenn es da noch list gibt.

Hintergrund: Ich möchte den Status aller Lichter im Haus bekommen. Bei Dimmern ist der Status aber nicht on/off. Also schreibe ich mir eine Funktion, die ein Array empfangen kann, als return gibt diese Funktion dann den Alias der Lichter zurück und den jeweiligen Status und bei Dimmern eben noch die Dimmereinstellung.
In meiner Funktion könnte ich ReadingsVal und AttrVal aufrufen (siehe erster Post) - das ist aber programmatisch hässlich. Ein Call wäre viel schöner.
Titel: Antw:Mehere Eigenschaften eines Devices abholen mit einem Befehl?
Beitrag von: Benni am 05 März 2017, 15:09:14
Wo brauchst du das denn? Nur zur Anzeige? Dann ist vllt. readingsGroup geeigneter.

fhem-Befehle kann man in Perl übrigens mit der fhem-FUnktion auführen, also auch sowas:


my $ret=fhem('jsonlist2 WEB');
Titel: Antw:Mehere Eigenschaften eines Devices abholen mit einem Befehl?
Beitrag von: moontear am 05 März 2017, 15:20:27
Now we're getting somewhere!

  my $readout=fhem('jsonlist2 Licht_Kuechentisch state alias protocol');
  my $json = from_json( $readout, { utf8  => 1 } );
  Log 1,scalar(keys($json));

Log:
2017.03.05 15:19:09 1: 3

Anzahl 3 passt weil (Arg, Result, totalResultsReturned):
{
  "Arg":"Licht_Kuechentisch state alias protocol",
  "Results": [
  {
    "Name":"Licht_Kuechentisch",
    "Internals": { },
    "Readings": {
      "protocol": { "Value":"V3", "Time":"2017-01-14 18:49:18" },
      "state": { "Value":"off", "Time":"2017-03-05 10:39:50" }
    },
    "Attributes": {      "alias": "Küchentisch" }
  }  ],
  "totalResultsReturned":1
}


Ich bekomme also den Hashtable schick zurück - jetzt muss ich das ganze nur noch auslesen. Fühlt sich alles sehr manuell an als wenn das noch nie jemand gemacht hätte ;-)
Titel: Antw:Mehere Eigenschaften eines Devices abholen mit einem Befehl?
Beitrag von: Benni am 06 März 2017, 09:26:15
Schau dir mal den Thread hier noch durch, vielleicht findest du da noch was, was du brauchen kannst ;)

https://forum.fhem.de/index.php/topic,66761.msg580671.html#msg580671
Titel: Antw:Mehere Eigenschaften eines Devices abholen mit einem Befehl?
Beitrag von: dev0 am 06 März 2017, 10:16:12
jsonlist2 ist an der Stelle wie: Ins Knie, durch die Brust, ins Auge, ...
Benutze besser ReadingsNum, etc. und verpacke das in eine Schleife mit devspec2array(), wenn Du mehrere Werte auslesen willst oder es generischer auslegen möchtest.
Titel: Antw:Mehere Eigenschaften eines Devices abholen mit einem Befehl?
Beitrag von: moontear am 06 März 2017, 10:46:18
Too late - siehe CheckLights.pm mit jsonlist2... ;)

Habe jetzt nur einen Parameter dynamisch, könnte man aber erweitern auf mehrere Parameter. Vorteil von jsonlist2 ist dass ich das auch auf meiner remote FHEM Installation benutzen kann. Die jsonlist Musik spielt in GetDeviceParameters. Die anderen subs arbeiten lediglich mit den empfangenen Daten.

Falls ihr ausprobieren wollt, müsst ihr %lights anpassen, ich habe ein paar Beispiele drin gelassen und die $remoteurl falls ihr das per Remote macht.