Edit: Das Modul für diese Aufgabe gibt es seit der Version 5.6 als CustomReadings (http://forum.fhem.de/index.php/topic,26810.0.html)
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.
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.
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
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.