[gelöst] Wie aus einem Device mehrere machen - od Dummies per DOIF aus Log befüllen?

Begonnen von dadoc, 22 Februar 2024, 17:31:39

Vorheriges Thema - Nächstes Thema

dadoc

Hallo zusammen,

ich habe drei Wärmemengenzähler; einen (Nr. 1)  habe ich mit einem WMBUS Funkmodul ausgestattet. Das sendet die kompletten Daten dieses Zählers sowie die reinen Verbrauchsdaten der beiden anderen, die über deren Impulsausgänge an die Impulseingänge des MBUS-Moduls angeschlossen sind. Ich habe das so gemacht, um mir zwei weitere, recht teure Funkmodule zu sparen...

Die Daten empfange ich über einen Esp32/WLAN und das fhem WMBUS-Modul in fhem, und das klappt auch gut.

Schönheitsfehler ist dabei, dass fhem aus nachvollziehbaren Gründen nur ein Device anlegt (das des Zählers mit dem Funkmodul), damit aber die Daten der drei Zähler empfängt. Und dass die Readings, etwa zum Verbrauch, bei den drei Zählern identisch heißen.
Unterscheiden lassen sich die drei Datenpakete durch die VIF_PARAMETER_SET_ID, die singulär und konstant ist; sie erscheint zeilenmäßig allerdings erst nach den Verbrauchswerten im Diagramm.

Gefiltert auf ID und Verbrauchswert (in Wh) sieht das im Log z.B. so aus:
2024-02-22_14:33:44 WMBUS_EFE_94871746_0_4 0_VIF_PARAMETER_SET_ID_value: 12560
2024-02-22_14:33:46 WMBUS_EFE_94871746_0_4 0_VIF_ENERGY_WATT_value: 30617000
2024-02-22_14:33:46 WMBUS_EFE_94871746_0_4 0_VIF_PARAMETER_SET_ID_value: 13328
2024-02-22_14:48:34 WMBUS_EFE_94871746_0_4 0_VIF_ENERGY_WATT_value: 101256000
2024-02-22_14:48:34 WMBUS_EFE_94871746_0_4 0_VIF_PARAMETER_SET_ID_value: 13072
2024-02-22_15:03:22 WMBUS_EFE_94871746_0_4 0_VIF_ENERGY_WATT_value: 78953000
2024-02-22_15:03:22 WMBUS_EFE_94871746_0_4 0_VIF_PARAMETER_SET_ID_value: 12560
2024-02-22_15:03:24 WMBUS_EFE_94871746_0_4 0_VIF_ENERGY_WATT_value: 30621000
2024-02-22_15:03:24 WMBUS_EFE_94871746_0_4 0_VIF_PARAMETER_SET_ID_value: 13328
2024-02-22_15:18:11 WMBUS_EFE_94871746_0_4 0_VIF_ENERGY_WATT_value: 78954000
2024-02-22_15:18:11 WMBUS_EFE_94871746_0_4 0_VIF_PARAMETER_SET_ID_value: 12560
2024-02-22_15:18:12 WMBUS_EFE_94871746_0_4 0_VIF_ENERGY_WATT_value: 101257000
2024-02-22_15:18:12 WMBUS_EFE_94871746_0_4 0_VIF_PARAMETER_SET_ID_value: 13072
2024-02-22_15:33:00 WMBUS_EFE_94871746_0_4 0_VIF_ENERGY_WATT_value: 101257000
2024-02-22_15:33:00 WMBUS_EFE_94871746_0_4 0_VIF_PARAMETER_SET_ID_value: 13072
2024-02-22_15:47:46 WMBUS_EFE_94871746_0_4 0_VIF_ENERGY_WATT_value: 78956000
2024-02-22_15:47:46 WMBUS_EFE_94871746_0_4 0_VIF_PARAMETER_SET_ID_value: 12560
2024-02-22_15:47:47 WMBUS_EFE_94871746_0_4 0_VIF_ENERGY_WATT_value: 101258000
2024-02-22_15:47:47 WMBUS_EFE_94871746_0_4 0_VIF_PARAMETER_SET_ID_value: 13072
Das ist wie gesagt per RegEx gefiltert; ungefiltert sehen die Telegramme für einen per Impulseingang an Zähler 1 angeschlossenen weiteren Zähler z.B. so aus:
2024-02-20_13:00:34 WMBUS_EFE_94871746_0_4 RSSI: -138
2024-02-20_13:00:34 WMBUS_EFE_94871746_0_4 LQI: 240
2024-02-20_13:00:34 WMBUS_EFE_94871746_0_4 0_VIF_TIME_POINT_DATE_TIME_value: 2024-02-20 14:00
2024-02-20_13:00:34 WMBUS_EFE_94871746_0_4 0_VIF_TIME_POINT_DATE_TIME_unit:
2024-02-20_13:00:34 WMBUS_EFE_94871746_0_4 0_VIF_TIME_POINT_DATE_TIME_value_type: Instantaneous value
2024-02-20_13:00:34 WMBUS_EFE_94871746_0_4 0_VIF_ENERGY_WATT_value: 71516000
2024-02-20_13:00:34 WMBUS_EFE_94871746_0_4 0_VIF_ENERGY_WATT_unit: Wh
2024-02-20_13:00:34 WMBUS_EFE_94871746_0_4 0_VIF_ENERGY_WATT_value_type: Instantaneous value
2024-02-20_13:00:34 WMBUS_EFE_94871746_0_4 0_VIF_MODEL_VERSION_value: 18446744073625665536
2024-02-20_13:00:34 WMBUS_EFE_94871746_0_4 0_VIF_MODEL_VERSION_unit:
2024-02-20_13:00:34 WMBUS_EFE_94871746_0_4 0_VIF_MODEL_VERSION_value_type: Instantaneous value
2024-02-20_13:00:34 WMBUS_EFE_94871746_0_4 0_VIF_PARAMETER_SET_ID_value: 13072
2024-02-20_13:00:34 WMBUS_EFE_94871746_0_4 0_VIF_PARAMETER_SET_ID_unit:
2024-02-20_13:00:34 WMBUS_EFE_94871746_0_4 0_VIF_PARAMETER_SET_ID_value_type: Instantaneous value
2024-02-20_13:00:34 WMBUS_EFE_94871746_0_4 batteryState: ok
2024-02-20_13:00:34 WMBUS_EFE_94871746_0_4 is_encrypted: 1
2024-02-20_13:00:34 WMBUS_EFE_94871746_0_4 decryption_ok: 1
2024-02-20_13:00:34 WMBUS_EFE_94871746_0_4 no errors
2024-02-20_13:00:34 WMBUS_EFE_94871746_0_4 rawmsg: Y
bzw. entsprechend ausführlicher von Zähler 1:
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 RSSI: -138
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 LQI: 143
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_TIME_POINT_DATE_TIME_value: 2024-02-20 14:00
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_TIME_POINT_DATE_TIME_unit:
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_TIME_POINT_DATE_TIME_value_type: Instantaneous value
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_ENERGY_WATT_value: 78796000
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_ENERGY_WATT_unit: Wh
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_ENERGY_WATT_value_type: Instantaneous value
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_ERROR_FLAGS_value: 3634
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_ERROR_FLAGS_unit:
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_ERROR_FLAGS_value_type: Instantaneous value
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_VOLUME_value: 8902.653
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_VOLUME_unit: m³
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_VOLUME_value_type: Instantaneous value
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_VOLUME_FLOW_value: 0.062
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_VOLUME_FLOW_unit: m³/h
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_VOLUME_FLOW_value_type: Instantaneous value
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_ELECTRIC_POWER_value: 1848
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_ELECTRIC_POWER_unit: W
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_ELECTRIC_POWER_value_type: Instantaneous value
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_FLOW_TEMP_value: 53
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_FLOW_TEMP_unit: °C
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_FLOW_TEMP_value_type: Instantaneous value
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_RETURN_TEMP_value: 27
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_RETURN_TEMP_unit: °C
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_RETURN_TEMP_value_type: Instantaneous value
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_TEMP_DIFF_value: 25.67
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_TEMP_DIFF_unit: K
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_TEMP_DIFF_value_type: Instantaneous value
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_MODEL_VERSION_value: 18446744073625665536
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_MODEL_VERSION_unit:
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_MODEL_VERSION_value_type: Instantaneous value
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_PARAMETER_SET_ID_value: 12560
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_PARAMETER_SET_ID_unit:
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 0_VIF_PARAMETER_SET_ID_value_type: Instantaneous value
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 batteryState: ok
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 is_encrypted: 1
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 decryption_ok: 1
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 no errors
2024-02-20_13:01:08 WMBUS_EFE_94871746_0_4 rawmsg: Y
Im Prinzip brauche ich nur die Verbrauchsdaten pro Zähler zu bestimmten Zeitpunkten, also VIF_ENERGY_WATT_value. Ist zugegebenermaßen eine eher kosmetische Frage, denn natürlich könnte ich die Verbrauchswerte durch visuelle Anaylse der Logfile "per Hand" rausfinden. Aber ich mags halt ordentlich:
  • Ideal wäre es natürlich, wenn man das automatisch angelegte MBUS-Device in drei Devices splitten könnte, aber dazu ist mir kein Ansatz eingefallen.
  • Der "zweitbeste Fisch" wäre es, wenn man die Logfile splitten könnte. Hier scheitere ich RegEx-mäßig vor allem daran, dass die ID erst nach den Werten und zusammen mit ID und Werten der anderer Zähler in wechselnder Wagenreihung erfolgt.
  • Alternativ und wahrschenlich am Praktikabelsten wäre das wohl per DOIF/notify: Drei Dummies, die jeweils Timestamp + Verbrauchswert eines Zählers enthalten. Aber auch da stoße ich beim entsprechenden DOIF/Notify an meine Perl-Regex-Grenzen, konkret beim Analysieren der Logfile und dem "Nach-Oben-Schauen" beim Erreichen der jeweiligen 0_VIF_PARAMETER_SET_ID_value. Man müsste wohl auf 0_VIF_ENERGY_WATT_value triggern, dann diesen und die Folgezeile einlesen, die beiden Zeilen auf den Verbrauchswert und die ID analysieren und mit damit den zur ID gehörigen Dummy aktualisieren.
Könnt Ihr mir dabei helfen? Andere Ideen sind natürlich auch willkommen.
Danke & Grüße
Martin


Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods

Damian

Du kannst einfach die SET_ID_value abfragen und die passende Wattzahl im entsprechenden Reading speichern, das du woanders wieder nutzen kannst.

z. B. im DOIF-Perlmodus:

define EFE DOIF {
  if ([WMBUS_EFE_94871746_0_4:0_VIF_PARAMETER_SET_ID_value] == 12560) {
    set_Reading("V12560",[?WMBUS_EFE_94871746_0_4:0_VIF_ENERGY_WATT_value],1)
  } elsif ([WMBUS_EFE_94871746_0_4:0_VIF_PARAMETER_SET_ID_value] == 13328) {
    set_Reading("V13328",[?WMBUS_EFE_94871746_0_4:0_VIF_ENERGY_WATT_value],1)
  } elsif ([WMBUS_EFE_94871746_0_4:0_VIF_PARAMETER_SET_ID_value] == 13072) {
    set_Reading("V13072",[?WMBUS_EFE_94871746_0_4:0_VIF_ENERGY_WATT_value],1)
  }
}

Im DOIF-EFE sind dann im Reading V12460, V13328 und v13072 die entsprechenden Wattzahlen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

dadoc

Herzlichen Dank, das ist wirklich sehr elegant. Was bewirkt das Fragezeichen? Holt es den Wert von 0_VIF_ENERGY_WATT_value?
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods

Damian

Zitat von: dadoc am 22 Februar 2024, 22:11:00Herzlichen Dank, das ist wirklich sehr elegant. Was bewirkt das Fragezeichen? Holt es den Wert von 0_VIF_ENERGY_WATT_value?
Die Angaben in eckigen Klammern triggern bekanntlich gleichzeitig beim DOIF, das Fragezeichen unterbindet einen Trigger und stellt lediglich nur eine Abfrage dar. Hier dürfte es aber ziemlich egal sein, weil Watt_value und set_ID vermutlich im gleichen Event-Block liegen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Diese Lösung ist kürzer und funktioniert für beliebig viele IDs.

define EFE DOIF {
  my $id=[WMBUS_EFE_94871746_0_4:0_VIF_PARAMETER_SET_ID_value];
  set_Reading("V".$id,[?WMBUS_EFE_94871746_0_4:0_VIF_ENERGY_WATT_value],1);
}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

juemuc

Hallo,
ich werfe Mal das Stichwort "readingsProxy" in den Raum.
Damit kann man Readings zu devices machen.
Viele Grüße
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

Damian

Zitat von: juemuc am 23 Februar 2024, 09:42:05Hallo,
ich werfe Mal das Stichwort "readingsProxy" in den Raum.
Damit kann man Readings zu devices machen.
Viele Grüße
Jürgen

Kann man bei readingsProxy auch eine Bedingung angeben? Es reicht ja nicht einfach ein Reading zum Device zu machen, denn die Readings sind hier immer gleich.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

juemuc

Ich habe gerade gesehen, dass die Readings über die "Events" gefüllt werden sollen. Dann passt "readingsProxy" wohl nicht.

Viele Grüße
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

dadoc

Guten Morgen,
Ihr verwöhnt mich ;-)
Ich hätte noch eine letzte Frage, die ich selbst nicht gelöst bekomme: kann ich die Readings direkt im DOIF bzw. im Event durch 1000 bzw. 1.000.000 teilen, um KWh bzw. MWh zu bekommen, oder muss ich da mit userReadings ran?
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods

Damian

Zitat von: dadoc am 24 Februar 2024, 09:14:39Guten Morgen,
Ihr verwöhnt mich ;-)
Ich hätte noch eine letzte Frage, die ich selbst nicht gelöst bekomme: kann ich die Readings direkt im DOIF bzw. im Event durch 1000 bzw. 1.000.000 teilen, um KWh bzw. MWh zu bekommen, oder muss ich da mit userReadings ran?

Welch eine Frage?

In meinem Bespiel (DOIF-Perlmodus) befindest du dich ja bereits in Perl und da kannst du alles machen, was diese Programmiersprache zu bieten hat, insbesondere irgendwelche Berechnungen anstellen.

z. B.

set_Reading("V".$id,[?WMBUS_EFE_94871746_0_4:0_VIF_ENERGY_WATT_value]/1000,1);
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

dadoc

Danke - ich hatte es gerade per Trial & Error mit
set_Reading("Ps_12560",0.0001*[?WMBUS_EFE_94871746_0_4:0_VIF_ENERGY_WATT_value],1)hinbekommen. Ist bei mir halt mit ziemlichen Mühen verbunden, da mein Perl immer noch nicht so flüssig ist...
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods