FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Bartimaus am 25 Februar 2016, 11:38:40

Titel: Raw-Wert eines Counters in ein Reading ?
Beitrag von: Bartimaus am 25 Februar 2016, 11:38:40
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

Titel: Antw:Raw-Wert eines Counters in ein Reading ?
Beitrag von: Bennemannc am 25 Februar 2016, 12:35:26
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
Titel: Antw:Raw-Wert eines Counters in ein Reading ?
Beitrag von: Bartimaus am 25 Februar 2016, 13:05:51
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
Titel: Antw:Raw-Wert eines Counters in ein Reading ?
Beitrag von: CoolTux am 25 Februar 2016, 13:08:49


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
Titel: Antw:Raw-Wert eines Counters in ein Reading ?
Beitrag von: Bartimaus am 25 Februar 2016, 13:41:30
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

:'(
Titel: Antw:Raw-Wert eines Counters in ein Reading ?
Beitrag von: CoolTux am 25 Februar 2016, 14:58:04
Ich wüsste nur die Lösung welche ich Dir oben ansatzweise gegeben habe. Bisschen Perlkenntnis ist aber Voraussetzung
Titel: Antw:Raw-Wert eines Counters in ein Reading ?
Beitrag 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....
Titel: Antw:Raw-Wert eines Counters in ein Reading ?
Beitrag von: marvin78 am 25 Februar 2016, 16:28:01
Aber <device> hast du schon durch deinen Namen ersetzt!?
Titel: Antw:Raw-Wert eines Counters in ein Reading ?
Beitrag von: CoolTux am 25 Februar 2016, 16:31:41
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
Titel: Antw:Raw-Wert eines Counters in ein Reading ?
Beitrag von: Bartimaus am 02 März 2016, 14:53:36
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....
Titel: Antw:Raw-Wert eines Counters in ein Reading ?
Beitrag von: Bartimaus am 02 März 2016, 15:08:48
Zitat von: marvin78 am 25 Februar 2016, 16:28:01
Aber <device> hast du schon durch deinen Namen ersetzt!?

Ja
Titel: Antw:Raw-Wert eines Counters in ein Reading ?
Beitrag von: Bennemannc am 02 März 2016, 17:25:16
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.
Titel: Antw:Raw-Wert eines Counters in ein Reading ?
Beitrag von: Bartimaus am 02 März 2016, 17:40:55
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 ?
Titel: Antw:Raw-Wert eines Counters in ein Reading ?
Beitrag von: CoolTux am 02 März 2016, 19:27:36
Das hier könnte Dir dabei helfen (http://fhem.de/commandref_DE.html#DOIF_Filtern_nach_Zahlen)



Grüße
Titel: Antw:Raw-Wert eines Counters in ein Reading ?
Beitrag von: Bartimaus am 02 März 2016, 20:26:34
Danke, könnte helfen.

Filtert mir aber die Dezimalzahl aus dem Devicenamen heraus... :'(
Titel: Antw:Raw-Wert eines Counters in ein Reading ?
Beitrag von: CoolTux am 02 März 2016, 21:08:52
Am besten Du gibst mal Dein komplettes DOIF und Deine komplette myUtils Sub
Titel: Antw:Raw-Wert eines Counters in ein Reading ?
Beitrag von: Bartimaus am 02 März 2016, 22:01:00
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;
Titel: Antw:Raw-Wert eines Counters in ein Reading ?
Beitrag von: Bennemannc am 03 März 2016, 07:06:30
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
Titel: Antw:Raw-Wert eines Counters in ein Reading ?
Beitrag von: Bartimaus am 03 März 2016, 07:46:47
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....
Titel: Antw:Raw-Wert eines Counters in ein Reading ?
Beitrag von: marvin78 am 03 März 2016, 09:02:57
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.