dummy soll Rückgaben aus Programmaufruf verarbeiten und speichern [closed]

Begonnen von Fuchks, 29 Oktober 2014, 21:33:44

Vorheriges Thema - Nächstes Thema

Fuchks

Edit: Das Modul für diese Aufgabe gibt es seit der Version 5.6 als CustomReadings

Die Ausgaben eines Programmaufrufs sollen nach bestimmten Separatoren getrennt in verschiedene Variablen eines dummys aufgenommen werden.
Wie setzt man das um?
Habe dazu nichts passendes im Forum finden können.

Beispiel:
Der Aufruf des Programms "Energie" liefert die Ausgabe:
PL1: 123
PL2: 456
PL3: 789

Diese Ausgabe soll dann in die drei Variablen PL1, PL2, PL3 des dummys geschrieben werden.

betateilchen

Perl Grundlagen ;)

Da ist nur ein bisschen einfachstes regexp nötig:


  • Ergebnis des Programmaufrufes in eine Variable einlesen
  • Variableninhalt am Zeilenumbruch in ein Array splitten
  • mit einer foreach Schleife jeden Array-Eintrag am Leerzeichen splitten und den zweiten Wert in ein Ergebnisarray pushen

Danach kannst Du mit den Werten im Ergebnisarray machen, was Du willst.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Fuchks

Das funktioniert schon mal mit selbst definiertem Reading:

define Energie dummy
attr Energie userReadings Energie_Ausgabe {`Energie_Abruf`}


Problem ist jetzt nur, wie die Ausgabe von Energie_Abruf auf verschiedene selbst definierte Readings von Energie aufgeteilt wird?
Nehmen wir an, die Werte sind per Zeilenumbruch separiert und sollen auf die userReadings Energie_Ausgabe1, ..., Energie_Ausgabe[n] aufgeteilt werden, wobei [n] konstant ist.
Wichtig ist, dass Energie_Abruf nur einmal für alle userReadings ausgeführt wird.
Bin nicht vertraut mit Perl, deswegen wäre das Splitten schon ein Problem - klar kann ich mich einlesen, aber wenn jemand das aus dem FF kann, würde mir das eine Menge Arbeit ersparen  ;)

Könnte das prinzipiell so funktionieren?

define Energie dummy
attr Energie userReadings Energie_Ausgabe {`Energie_Abruf`}
attr Energie userReadings Energie_Ausgabe1 {Energie:Energie_Ausgabe[1]}
attr Energie userReadings Energie_Ausgabe2 {Energie:Energie_Ausgabe[2]}
attr Energie userReadings Energie_Ausgabe3 {Energie:Energie_Ausgabe[3]}
attr Energie userReadings Energie_Ausgabe[n] {Energie:Energie_Ausgabe[n]}


wobei der Ausdruck Energie:Energie_Ausgabe[n] das Reading Energie_Ausgabe vom Device Energie auslesen und davon den n. Wert zurückgeben müsste

betateilchen

Lege Dir einen hash an, in dem Du die Werte sammelst, und wenn Du alle Werte zusammen hast, verarbeitest Du das Ganze in einer Schleife zu readings.
Sowas hab ich in meinem GDS beispielsweise im Einsatz, da muss ich nichtmal wissen, wie das Reading selbst heißt, weil selbst der Name im hash abgelegt wird.


my %readings;
$readings{a_altitude} = $alertsXml->{info}[$info]{area}[$area]{altitude};
$readings{a_ceiling} = $alertsXml->{info}[$info]{area}[$area]{ceiling};

readingsBeginUpdate($hash);
while(($k, $v) = each %readings) {
readingsBulkUpdate($hash, $k, $v);
}
readingsEndUpdate($hash, 1);



Im Beispiel werden die beiden readings a_altitude und a_ceiling angelegt und mit Werten aus einer XML-Struktur gefüllt.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!