Moin,
hat jemand nen Tip wie ich den RAW-Wert eines Counters (OWCOUNT) in ein eigenes Reading packen kann ?
Der RAW-Wert lässt sich mit get <device> raw <Counter>
abfragen
Hallo,
dafür gibt es userReadings - sind in der commandref erklärt.
Als zweite Alternative wäre da eine Perl sub in der 99_myUtils. Ich denke aber mit userReading sollte das zu machen sein.
Gruß Christoph
Hallo Christoph,
danke für den Tip. An UserReadings dachte ich auch schon, habe auch dazu in der Commandref nachgelesen, hatte das aber so verstanden das man damit nur weitere Readings aus bereits vorhandenen Readings generieren kann :o
my $counterwert = fhem "get <device> raw <Counter>";
schau mal ob das so geht.
Musst natürlich bisschen Perl rumpacken. Am besten in eine 99_myUtils
Auf die Schnelle via iPad probiert:
[attr <device> userReadings ZaehlerA {fhem "get <device> raw A"}
blockiert mein FHEM mit:
OWCOUNT: Could not get values from device device>, reason: OWCOUNT: Could not get values from device <device>, reason: OWX_ASYNC_Schedule: Master not Active
:'(
Ich wüsste nur die Lösung welche ich Dir oben ansatzweise gegeben habe. Bisschen Perlkenntnis ist aber Voraussetzung
Danke, bin nur ein technisch interessierter Laie, dh. habe keine Perlkenntnisse, würde aber gerne dazulernen....
Aber <device> hast du schon durch deinen Namen ersetzt!?
Zitat von: Bartimaus am 25 Februar 2016, 15:34:14
Danke, bin nur ein technisch interessierter Laie, dh. habe keine Perlkenntnisse, würde aber gerne dazulernen....
Das finde ich wirklich gut. Gibt ja zum Glück viel Lesestoff zu Perl im Internet. Na dann viel Erfolg.
Und wenn Du fragen hast, einfach fragen.
Grüße
Sodele, bin "etwas" weiter.
In die 99_MyUtils habe ich wie folgt eingefügt:
### Ermittlung des rohen Counterwertes
sub StromCounterA($)
{
my ($counterwert) = fhem "get <device> raw A";
}
Dann ein DOIF welches alle 5min aufgerufen wird. Darin dann ein Userreading:
userReadings RAW {StromCounterA($name)}
Das Reading "RAW" sehe ich nun im DOIF, allerdings nur mit dem Wert "1", der sich nicht ändert.
Hat noch jemand nen Tip ?
Rufe ich in der CommandZeile "get <device> raw A" auf, erhalte ich den aktuellen Wert (105223)
Edit: Hm, im Logfile sehe ich den RAW-Wert des Counters. Jetzt muss er nur noch in das Reading rein....
Zitat von: marvin78 am 25 Februar 2016, 16:28:01
Aber <device> hast du schon durch deinen Namen ersetzt!?
Ja
Hallo,
schreib mal bevor Du die } machst.
return $counterwert;
Sonst berechnet die Funktion nur und gibt den Wert nicht an das aufrufende Element zurück.
Gruß Christoph
BTW in der letzten Zeile der 99_MyUtils muss "1;" stehen.
Hallo Christoph,
danke. Jetzt wird der Wert zwar geschrieben, aber die komplette Ausgabe, und zwar so:
OWCOUNT: <device>.raw A => 2058244
Wie kann ich das formatieren damit ich nur den Zahlenwert habe ?
Hast Du da noch einen Tip bitte ?
Stateformat mit sprintf ?
Sinnvoller wäre es doch den gewünschten (Zahlen)wert direkt in der MyUtils in das aufzurufende Element zu übergeben, oder ?
Das hier könnte Dir dabei helfen (http://fhem.de/commandref_DE.html#DOIF_Filtern_nach_Zahlen)
Grüße
Danke, könnte helfen.
Filtert mir aber die Dezimalzahl aus dem Devicenamen heraus... :'(
Am besten Du gibst mal Dein komplettes DOIF und Deine komplette myUtils Sub
Hi,
Internals:
DEF ([+:01:00])
NAME CounterA
NR 995
NTFY_ORDER 50-CounterA
STATE initialized
TYPE DOIF
Readings:
2016-03-02 20:25:23 RAW OWCOUNT: 1wire_Strom_Gesamt.raw A => 2062361
2016-03-02 20:25:22 state initialized
2016-03-02 20:25:23 timer_1_c1 03.03.2016 20:25:33
Condition:
0 DOIF_time_once($hash,$hash->{timer}{0},$wday,"")
Days:
Devices:
Do:
0:
0
Helper:
globalinit 1
last_timer 1
sleeptimer -1
Itimer:
Realtime:
0 20:25:33
State:
Time:
0 +01:00
Timecond:
0 0
Timer:
0 0
Timerfunc:
Timers:
0 0
Attributes:
room Strom
userReadings RAW { StromCounterA ($name) }
und der MyUtils-Auszug:
### Ermittlung des rohen Counterwertes
sub StromCounterA($)
{
my ($counterwert) = fhem "get 1wire_Strom_Gesamt raw A";
return $counterwert;
}
1;
Hallo,
warum übergibst Du der Funktion einen Wert ($name) ohne diesen in der Funktion zu nutzen ? Den Wert sollte man vor der Rückgabe mit regexp bearbeiten können - aber da bin ich nicht der Fachmann. Mit regexp breche ich mir auch immer einen ab.
Gruß Christoph
Moin,
was ich ehrlich gesagt nicht verstehe, ich übergebe in der MyUtils das Ergebnis aus der Abfrage in die Variable "$counterwert".
Frage ich allerdings diese Variable in dem Userreading ab, zB userReadings RAW { StromCounterA ($counterwert) }
so bekomme ich folgende Fehlermeldung:
"Error evaluating CounterA userReading RAW: Global symbol "$counterwert" requires explicit package name at (eval 30327) line 1."
Trage ich aber im Userreading "$name" statt "$counterwert" ein, wird zumindest das unformatierte Ergebnis zurückgeliefert.
Formatiere ich gem. CoolTux Link das Ergebnis in der MyUtils wie folgt:
### Ermittlung des rohen Counterwertes
sub StromCounterA($)
{
my ($name) = fhem "get 1wire_Strom_Gesamt raw A";
return printf("(-?\d+(\.\d+)?)",$name);
}
Bekomme ich korrekterweise "1" als Ergebnis = Reading:RAW zurückgeliefert, weil die 1 aus dem Devicenamen herausgefiltert wird.
Jetzt brauche ich "nur" noch ein anderes regexp....
userReadings RAW { StromCounterA ($counterwert) }
damit greifst du nicht auf die Variable zu, sondern du sendest ihren Inhalt (der in dem Fall nicht vorhanden ist - deshalb der Fehler) an die Funktion StromCounterA. Ich denke, du wirst dich ein wenig mit Perl und Programmierung im Allgemeinen auseinandersetzen müssen. Man ruft Funktionen mit Parametern (die einen Inhalt haben) auf und gibt in der Funktion dann Werte zurück (return).
$name enthält in userReadings übrigens den Devicenamen.