Mehere Eigenschaften eines Devices abholen mit einem Befehl?

Begonnen von moontear, 05 März 2017, 14:06:37

Vorheriges Thema - Nächstes Thema

moontear

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?

Benni


moontear

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.

Benni

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!)

moontear

"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.

Benni

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

moontear

#6
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.

Benni

#7
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');

moontear

#8
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 ;-)

Benni

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

dev0

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.

moontear

#11
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.