Hi,
ich habe jetzt mal selbst Hand angelegt und einen Patch gemacht.
Der Patch macht folgendes: Wenn ein DataBlock ein Feld vom Typ VIF_TIME_POINT_DATE_TIME enthält, dann ist die zugehörige
"storage_no" ein Kandidat für einen aktuellen Wert. Die alten Werte vom letzten Monat und vom letztem Jahr verwenden
alle den Datentyp VIF_TIME_POINT_DATE.
Wenn dann ein Datenblock mit passender storage_no und dem Datentyp "VIF_VOLUME" gefunden wird, dann wird zusätzlich folgende Zeile im Log ausgegeben:
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 currentVolumeValue: 39.52
Im Graph wird dann einfach als Regex "currentVolumeValue" ausgewählt. Damit sind die Rücksprünge weg und die Kurve ist sauber.
Die Änderung ist kompatibel, da nur zusätzliche Zeilen eingefügt werden.
Theoretisch hätte ich auch die Zeitstempel vergleichen können, aber das hätte auch nicht mehr gebracht und das ganze nur komplizierter gemacht.
Ich hätte auch prüfen können, ob neue Werte kleiner sind als alte Werte, aber dann würde ich Annahmen über den Verlauf machen und ggf. gibt es Zähler
welche den Wert ab und zu zurücksetzen (z.B. am Jahresende).
Hier das kommentierte Telegramm:
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 RSSI: -43.5
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 LQI: 128
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 1_type: VIF_VOLUME
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 1_storage_no: 0 => Wurde weiter unten als Kandidat ausgewählt und der Datentyp VIF_VOLUME passt auch
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 1_value: 39.52 => Diesen Wert wird zusätzlich unter dem Namen "currentVolumeValue" ausgegeben
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 1_unit: m³
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 1_value_type: Instantaneous value
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 2_type: VIF_VOLUME
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 2_storage_no: 1
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 2_value: 32.953 => wird ignoriert, da zugehöriger Zeitstempel von storage_no=1 nur ein Datum ohne Uhrzeit ist
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 2_unit: m³
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 2_value_type: Instantaneous value
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 3_type: VIF_TIME_POINT_DATE
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 3_storage_no: 1
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 3_value: 2021-12-31
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 3_unit:
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 3_value_type: Instantaneous value
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 4_type: VIF_TIME_POINT_DATE
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 4_storage_no: 0
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 4_value: invalid: ffffffffffffffff
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 4_unit:
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 4_value_type: Value during error state
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 5_type: VIF_TIME_POINT_DATE_TIME => wähle storage_no 0 als Kandidat aus, weil Datentyp DATE_TIME ist
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 5_storage_no: 0
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 5_value: 2022-04-04 19:20
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 5_unit:
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 5_value_type: Instantaneous value
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 6_type: VIF_FABRICATION_NO
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 6_storage_no: 0
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 6_value: 35534962
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 6_unit:
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 6_value_type: Instantaneous value
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 currentVolumeValue: 39.52 => neue Zeile für den gefundenen Aktualwert
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 batteryState: ok
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 is_encrypted: 0
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 decryption_ok: 1
2022-04-04_20:20:11 WMBUS_LSE_09912169_216_6 no errors
Hier der Patch
--- 36_WMBUS.pm.orig 2022-04-03 16:12:13.133015668 +0200
+++ 36_WMBUS.pm 2022-04-05 19:53:39.100192457 +0200
@@ -351,9 +351,13 @@
my $readingBase;
my $useVIFasReadingName = defined($hash->{internal}{useVIFasReadingName}) ?
$hash->{internal}{useVIFasReadingName} : AttrVal($name, "useVIFasReadingName", 0);
+ my $curValStorageNum;
for $dataBlock ( @$dataBlocks ) {
next if AttrVal($name, "ignoreUnknownDataBlocks", 0) && $dataBlock->{type} eq 'MANUFACTURER SPECIFIC'; #WMBus::VIF_TYPE_MANUFACTURER_SPECIFIC
+ if ("$dataBlock->{type}" eq "VIF_TIME_POINT_DATE_TIME" and defined $dataBlock->{storageNo}) {
+ $curValStorageNum = $dataBlock->{storageNo};
+ }
if ($useVIFasReadingName) {
$readingBase = "$dataBlock->{storageNo}_$dataBlock->{type}";
if (defined($dataBlock->{extension_value})) {
@@ -377,6 +381,17 @@
readingsBulkUpdate($hash, "${readingBase}_errormsg", $dataBlock->{errormsg});
}
}
+
+ # create an own line for the value which has a complete timestamp and not only a date
+ # required for the warm water counter which not only transmit the current value but also
+ # the values of the end of the previous month and end of previous year
+ if(defined $curValStorageNum) {
+ for $dataBlock ( @$dataBlocks ) {
+ if ($dataBlock->{type} eq "VIF_VOLUME" and $dataBlock->{storageNo} == $curValStorageNum) {
+ readingsBulkUpdate($hash, "currentVolumeValue", $dataBlock->{value});
+ }
+ }
+ }
readingsBulkUpdate($hash, "batteryState", $mb->{status} & 4 ? "low" : "ok");
WMBUS_SetDeviceSpecificReadings($hash, $name, $mb);
Michael