Letzte Werte als Reading und Balkendiagramm: Unterschied zwischen den Versionen

Aus FHEMWiki
K (Torxgewinde verschob die Seite 🏺Letzte Werte als Reading und Balkendiagramm nach Letzte Werte als Reading und Balkendiagramm: Emoji im Titel kommt bestimmt nicht so gut an)
K (DBLog erwähnt, da sind die Werte gut abzurufen)
Zeile 60: Zeile 60:
Alternativ ist auch [[ReadingsHistory]] oder OldReadingsVal bzw. oldreadings interessant.
Alternativ ist auch [[ReadingsHistory]] oder OldReadingsVal bzw. oldreadings interessant.


Falls man die Werte in ein DBLog speichert, kann man die letzten Werte auch abrufen:<syntaxhighlight lang="perl">
get <DbLogDevice> retrieve last <deviceName> <readingName> "" "" "" 10
</syntaxhighlight>
[[Kategorie:HOWTOS]]
[[Kategorie:HOWTOS]]
[[Kategorie:Code Snippets]]
[[Kategorie:Code Snippets]]

Version vom 11. Juli 2023, 18:13 Uhr

Ein userReading der letzen N-Werte eines Readings des Devices beim Device selbst zu speichern geht wie folgt:


Beispiel, die letzten 10 Werte des State des Devices sollen in dem eigenem Reading "history10" gespeichert werden:

history10 {
    my $val = ReadingsVal("$name", "state", "???");
    my $ts = ReadingsTimestamp("$name", "state", undef);
   
    my $this = ReadingsVal("$name", "$reading", "");
    my $length = ($reading =~ /(\d+)/g)[-1];
    my @timestampArray = split("\n", $this);

    #optional: if ($timestampArray[-1] eq "$ts: $val") { return; }
    #optional: statt "history10" einfach "history10:state.*" als Readingnamen wählen
    push(@timestampArray, "$ts: $val");
    while ( scalar @timestampArray > $length ) { shift(@timestampArray); }

    my $serializedArray = join("\n", @timestampArray);
    return $serializedArray;
}

Wie lang die History sein soll, also wieviele Einträge gespeichert werden sollen, das wird mit der Zahl im userReadings Namen festgelegt. Der Output sieht dann bei einem PIR Sensor des FS20 Systems zum Beispiel so aus:

2023-06-07 20:06:37: off
2023-06-07 20:06:48: on-old-for-timer 60
2023-06-07 20:07:48: off
2023-06-07 20:25:16: on-old-for-timer 60
2023-06-07 20:25:46: on-old-for-timer 60
2023-06-07 20:26:46: off
2023-06-07 20:27:46: on-old-for-timer 60
2023-06-07 20:28:46: off
2023-06-07 20:39:53: on-old-for-timer 60
2023-06-07 20:40:53: off

Um das Beispiel eines PIR-Bewegungsmelders aus dem FS20 System abzuschließen, folgt die Definition des gesamten Device:

defmod ALARM.PIR2.1 FS20 1234 00
attr ALARM.PIR2.1 IODev FHZ1300PC
attr ALARM.PIR2.1 follow-on-for-timer 1
attr ALARM.PIR2.1 icon motion_detector
attr ALARM.PIR2.1 model fs20piri
attr ALARM.PIR2.1 userReadings history10 {\
    my $val = ReadingsVal("$name", "state", "???");;\
    my $ts = ReadingsTimestamp("$name", "state", undef);;\
    \
    my $this = ReadingsVal("$name", "$reading", "");;\
    my $length = ($reading =~ /(\d+)/g)[-1];;\
    my @timestampArray = split("\n", $this);;\
    \
    push(@timestampArray, "$ts: $val");;\
    while ( scalar @timestampArray > $length ) { shift(@timestampArray);; }\
    \
    my $serializedArray = join("\n", @timestampArray);;\
    return $serializedArray;;\
}

Um es zu verdeutlichen ein Foto des Device: Screenshot des PRI Sensors mit UserReading History

Alternativen

Alternativ ist auch ReadingsHistory oder OldReadingsVal bzw. oldreadings interessant.

Falls man die Werte in ein DBLog speichert, kann man die letzten Werte auch abrufen:

get <DbLogDevice> retrieve last <deviceName> <readingName> "" "" "" 10