[DBRep] maxvalue Reading (und evtl userReading) Frage

Begonnen von Kai-Alfonso, 30 September 2019, 16:46:19

Vorheriges Thema - Nächstes Thema

DS_Starter

#15
Moin Kai,

du hast alle deine Fragen schon korrekt selbst beantwortet.  :)
Alles ist so wie du sagst.

Super  :D
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Kai-Alfonso

Zitat von: DS_Starter am 02 Oktober 2019, 08:01:58
Moin Kai,

du hast alle deine Fragen schon korrekt selbst beantwortet.  :)
Alles ist so wie du sagst.

Super  :D

8) Die Doku ist ja auch recht gut - wenn ich mal was nicht verstehe, liegt es nur an mir und nicht am fehlender/schlechter Doku

Aber ich habe (mal wieder) eine Bonusfrage  8)

Bekommt die Prozedur mit, welchen set Befehl (set maxValue/minValue/averageValue) ich zum  Aufruf des userExitFn genutzt habe?

Weil dann bräuchte ich nur ein DbRep Device, um zum Beispiel historisch die maxValue und minValue in ein Reading schreiben zu lassen.

tl;dr

my $resr = "maxTemp";   # wenn set maxValue
my $resr = "minTemp"; # wenn set minValue


Dann bräuchte ich nur eine Prozedur/ein DbRep Device  für die historischen min/max Daten anstatt jeweils eine Prozedur/ein DbRep Device für jeweils min/max
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

DS_Starter

ZitatBekommt die Prozedur mit, welchen set Befehl (set maxValue/minValue/averageValue) ich zum  Aufruf des userExitFn genutzt habe?
Ja, das Reading im DbRep hat hinten dann MIN, AVG oder sowas. Muss man dann in der Sub berücksichtigen.

Vielleicht noch eine Ergänzung.
Wenn du mit aggregation=X die Auswertung über mehrere Perioden deines Auswertungszeitraumes durchführst, werden ja mehrere Readings im DbRep erstellt, für jede Periode eins. Also 12 Readings für eine Jahresauswertung mit monatlichen Perioden.

Diese Readings kannst du auch mit der Prozedur auswerten, musst nur den Regex und die Logik anpassen damit das auch sauber auseinandergenommen wird um die Ergebnisreadings in deinem Zieldevice zu erstellen.

Grüße,
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Kai-Alfonso

Zitat von: DS_Starter am 02 Oktober 2019, 08:32:24
Ja, das Reading im DbRep hat hinten dann MIN, AVG oder sowas. Muss man dann in der Sub berücksichtigen.

Vielleicht noch eine Ergänzung.
Wenn du mit aggregation=X die Auswertung über mehrere Perioden deines Auswertungszeitraumes durchführst, werden ja mehrere Readings im DbRep erstellt, für jede Periode eins. Also 12 Readings für eine Jahresauswertung mit monatlichen Perioden.

Diese Readings kannst du auch mit der Prozedur auswerten, musst nur den Regex und die Logik anpassen damit das auch sauber auseinandergenommen wird um die Ergebnisreadings in deinem Zieldevice zu erstellen.

Grüße,
Heiko

Hey - jetzt habe ich verstanden, das die userExitFn auf das Reading zugreift und ich darauf dann den Regex mache. Das war mir vorher nicht so klar. aggregation hatte ich noch gar nicht auf dem Schirm, ist aber eine tolle Sache. Jetzt muss ich mir nur noch klar werden, was ich genau will.   8)

Hab grade gesehen: aggregation = month liefert mir auch solche Werte:

2019-10-01 08:39:10   .associatedWith Umgebungssensor_Fassade_SuedSeite
     2019-10-02 08:57:10   2014-11-08__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2014-11 0.0000
     2019-10-02 08:57:10   2014-12-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2014-12 0.0000
     2019-10-02 08:57:10   2015-01-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2015-01 0.0000
     2019-10-02 08:57:10   2015-02-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2015-02 0.0000
     2019-10-02 08:57:10   2015-03-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2015-03 0.0000
     2019-10-02 08:57:10   2015-04-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2015-04 0.0000
     2019-10-02 08:57:10   2015-05-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2015-05 0.0000
     2019-10-02 08:57:10   2015-06-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2015-06 0.0000
     2019-10-02 08:57:10   2015-07-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2015-07 0.0000
     2019-10-02 08:57:10   2015-08-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2015-08 0.0000
     2019-10-02 08:57:10   2015-09-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2015-09 0.0000
     2019-10-02 08:57:10   2015-10-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2015-10 0.0000
     2019-10-02 08:57:10   2015-11-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2015-11 0.0000
     2019-10-02 08:57:10   2015-12-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2015-12 0.0000
     2019-10-02 08:57:10   2016-01-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2016-01 0.0000
     2019-10-02 08:57:10   2016-02-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2016-02 0.0000
     2019-10-02 08:57:10   2016-03-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2016-03 0.0000
     2019-10-02 08:57:10   2016-04-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2016-04 0.0000
     2019-10-02 08:57:10   2016-05-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2016-05 0.0000
     2019-10-02 08:57:10   2016-06-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2016-06 0.0000
     2019-10-02 08:57:10   2016-07-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2016-07 0.0000
     2019-10-02 08:57:10   2016-08-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2016-08 0.0000
     2019-10-02 08:57:10   2016-09-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2016-09 0.0000
     2019-10-02 08:57:10   2016-10-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2016-10 0.0000
     2019-10-02 08:57:10   2016-11-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2016-11 0.0000
     2019-10-02 08:57:10   2016-12-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2016-12 0.0000
     2019-10-02 08:57:10   2017-01-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2017-01 0.0000
     2019-10-02 08:57:10   2017-02-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2017-02 0.0000
     2019-10-02 08:57:10   2017-03-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2017-03 0.0000
     2019-10-02 08:57:10   2017-04-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2017-04 0.0000
     2019-10-02 08:57:10   2017-05-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2017-05 0.0000
     2019-10-02 08:57:10   2017-06-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2017-06 0.0000
     2019-10-02 08:57:10   2017-07-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2017-07 0.0000
     2019-10-02 08:57:10   2017-08-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2017-08 0.0000
     2019-10-02 08:57:10   2017-09-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2017-09 0.0000
     2019-10-02 08:57:10   2017-10-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2017-10 0.0000
     2019-10-02 08:57:10   2017-11-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2017-11 0.0000
     2019-10-02 08:57:10   2017-12-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2017-12 0.0000
     2019-10-02 08:57:10   2018-01-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2018-01 0.0000
     2019-10-02 08:57:10   2018-02-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2018-02 0.0000
     2019-10-02 08:57:10   2018-03-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2018-03 0.0000
     2019-10-02 08:57:10   2018-04-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2018-04 0.0000
     2019-10-02 08:57:10   2018-05-01__Umgebungssensor_Fassade_SuedSeite__temperature__MAX__2018-05 0.0000


Also Monatswerte vom November 2014 bis Mai 2018 mit 0 Werten - in den Monaten gibt es keine DB Einträge mit dem Device (das kam erst im Juni 2018). Allerdings sind in der DB Einträge am 2014 von anderen Devices...was vielleicht erklärt, wieso er auf 2014 kommt. Kann man das irgendwie unterdrücken?
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

DS_Starter

ZitatAllerdings sind in der DB Einträge am 2014 von anderen Devices...was vielleicht erklärt, wieso er auf 2014 kommt. Kann man das irgendwie unterdrücken?
Hmm, eigentlich nur über die time* Attribute momentan. Also erst mit der Auswertung beginnen wenn es die DS gibt.
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Kai-Alfonso

Ich hab das jetzt mal so deine Prozedur abgewandelt, damit ich für min/max nicht 2 Dbrep Devices brauche. Geht bestimmt eleganter/besser, funktioniert aber so erstmal  8)

############################################################################################################
##        Reading maxTemp12M im Ursprungdevice aus maxValue setzen   
##        $name    = Name des DbRep-Devices
##        $reading = das übergebene Reading vom DbRep-Device in der Form:
##                   2019-10-01_11-44-45__SMA_Energymeter__Einspeisung_Wirkleistung__MAX__no_aggregation
##        $value   = der Wert des übergebenen Readings
############################################################################################################
sub TempHist {
my ($name,$reading,$value) = @_;
my $resr;

if($reading =~ /^.*__MAX.*$/) {
       $resr = "MaxTempHist";
}   

if($reading =~ /^.*__MIN.*$/) {
       $resr = "MinTempHist";


if($reading =~ /^.*__temperature.*$/) {                                         # es ist das Ergebnis aus  Ursprungdevice / ausgewertetes Reading / MAX
     my ($ts,$dev,undef) = split("__",$reading,3);                              # Extraktion Timestamp, Ursprungdevice = Device in dem das Reading erstellt wird
     $ts      =~ /^(\d+)-(\d+)-(\d+)_(\d+)-(\d+)-(\d+)$/;                       # Aufteilung Timestamp
     my $pmts = "$1-$2-$3 $4:$5:$6";                                            # Neuzusammenstellung des Timestamp
     my $hash = $defs{$dev};                                                    # hash des Zieldevices
     # readingsSingleUpdate($hash, $resr, $value, 1);                           # wenn man den aktuellen Timestamp setzt (Normalfall)
     setReadingsVal($hash,$resr,$value,$pmts);                                  # !!! Spezialfall !!! abweichenden Timestamp setzen
}
return;
}
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

DS_Starter

ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Kai-Alfonso

Hi Heiko,

vielleicht könntest Du mir noch mal kurz behilflich sein?  8) :o :o

Ich habe das Perl-Script ein wenig angepasst:

sub TempStatistik {
my ($name,$reading,$value) = @_;
my $resr;

$resr = $reading =~ /(?<=__)(.*)(?=__)/;


if($reading =~ /^.*Temp.*$/) {                                            # es ist das Ergebnis aus  Ursprungdevice / ausgewertetes Reading / MAX
     my ($ts,$dev,undef) = split("__",$reading,3);                              # Extraktion Timestamp, Ursprungdevice = Device in dem das Reading erstellt wird
     $ts      =~ /^(\d+)-(\d+)-(\d+)_(\d+)-(\d+)-(\d+)$/;                       # Aufteilung Timestamp
     my $pmts = "$1-$2-$3 $4:$5:$6";                                            # Neuzusammenstellung des Timestamp
     my $hash = $defs{$dev};                                                    # hash des Zieldevices
     # readingsSingleUpdate($hash, $resr, $value, 1);                           # wenn man den aktuellen Timestamp setzt (Normalfall)
     setReadingsVal($hash,$resr,$value,$pmts);                                  # !!! Spezialfall !!! abweichenden Timestamp setzen
}
return;
}


Hintergrund ist, das ich dann nicht für die verschiedenen Statistiken keine unterschiedlichen Subs und DBRep Devices brauche, weil ich die entsprechenden Attribute vor der Erstellung der Statistiken entsprechend ändere.

Ein typisches Reading sieht wie folgt aus

2019-10-31_07-13-39__MinTempDay__no_aggregation

MinTempDay ist mit readingNameMap gemappt und wird je nach Art der Auswertung geändert (in zb. MaxTempDay etc.)

Mit $resr = $reading =~ /(?<=__)(.*)(?=__)/;

sollte ich ja eigentlich aus dem Reading den Mittelpart selektieren und später dann als Zielreading nutzen können.

Leider funktioniert das nicht - es kommen auch keine Fehler oder ähnliches. Wo habe ich da einen (Denk-) Fehler gemacht?

Das List des DBRep-Devices

Internals:
   .FhemMetaInternals 1
   DATABASE   fhem
   DEF        DBLog
   FUUID      5d97397e-f33f-ce3b-b1d6-3954147b01fee5e9
   FVERSION   93_DbRep.pm:v8.28.2-s20379/2019-10-18
   LASTCMD    minValue display
   MODEL      Client
   NAME       DbRep.Statistik
   NOTIFYDEV  global,DbRep.TempDay_SuedSeite
   NR         237
   NTFY_ORDER 50-DbRep.TempDay_SuedSeite
   ROLE       Client
   STATE      done
   TYPE       DbRep
   UTF8       0
   .attraggr:
   .attreour:
     state
   .attrminint:
   HELPER:
     DBLOGDEVICE DBLog
     IDRETRIES  3
     MINTS      2014-11-08 09:27:00
     PACKAGE    main
     SQLHIST   
     UEFN_REGEXP attr DbRep.Statistik readingNameMap MinTempDay
     USEREXITFN TempStatistik
     VERSION    8.28.2
     CV:
       aggregation no
       aggsec     1
       destr      2019-10-31
       dsstr      2019-10-31
       epoch_seconds_end 1572521183
       mestr      10
       msstr      10
       testr      12:26:23
       tsstr      00:00:00
       wdadd      345600
       yestr      2019
       ysstr      2019
     DBREPCOL:
       COLSET     1
       DEVICE     64
       EVENT      512
       READING    64
       TYPE       64
       UNIT       32
       VALUE      128
   OLDREADINGS:
   READINGS:
     2019-10-31 12:26:23   .associatedWith Umgebungssensor_Fassade_SuedSeite
     2019-10-31 12:26:24   2019-10-31_07-13-39__MinTempDay__no_aggregation -3.0000
     2019-10-31 12:26:24   background_processing_time 0.0833
     2019-10-31 12:26:24   sql_processing_time 0.0411
     2019-10-31 12:26:24   state           done
Attributes:
   allowDeletion 1
   device     Umgebungssensor_Fassade_SuedSeite
   event-on-update-reading state
   reading    temperature
   readingNameMap MinTempDay
   room       Datenbank
   showproctime 1
   timestamp_begin current_day_begin
   userExitFn TempStatistik



BonusFrage: Habe mit Log versucht, mir die Variable ins Log schreiben zu lassen, aber selbst mit

Log 1, "Test";

erscheint nix im Log (ich nehm an Fhemlog?)

wo ist denn da der Fehler?


10000 Dank :-)
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

DS_Starter

Hallo Kai,

bin zur Zeit im Kurzurlaub und kann dich gerade nur rudimentär unterstützen.
Dieser Teil

$resr = $reading =~ /(?<=__)(.*)(?=__)/;

ist so nicht richtig. So könnte es funktionieren


$reading =~ /^.*__(.*)__.*$/;
$resr = $1;
...


Ich empfehle dir den Regextester https://regex101.com/ um deine Regex vorher zu testen und durchzuspielen.
Damit kommt man sehr gut zum Ziel.
Montag kann ich wieder mehr unterstützen.

Grüße,
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Kai-Alfonso

Zitat von: DS_Starter am 31 Oktober 2019, 19:25:58
Hallo Kai,

bin zur Zeit im Kurzurlaub und kann dich gerade nur rudimentär unterstützen.
Dieser Teil

$resr = $reading =~ /(?<=__)(.*)(?=__)/;

ist so nicht richtig. So könnte es funktionieren


$reading =~ /^.*__(.*)__.*$/;
$resr = $1;
...


Ich empfehle dir den Regextester https://regex101.com/ um deine Regex vorher zu testen und durchzuspielen.
Damit kommt man sehr gut zum Ziel.
Montag kann ich wieder mehr unterstützen.

Grüße,
Heiko

Hey Heiko,

kein Streß - eilt nicht. Regex teste ich generell erstmal gegen regex101 oder ähnliche Seiten, der müsste eigentlich passen.

Leider geht es durch deine Änderung auch nicht - schauen wir mal zusammen nächste Woche drauf. Schönen Kurzurlaub  8)
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

DS_Starter

Danke  :)

Habe doch etwas Zeit gefunden und auch ausprobiert. So funktioniert es


sub TempStatistik {
my ($name,$reading,$value) = @_;
my $resr;

if($reading =~ /^.*Temp.*$/) {                                            # es ist das Ergebnis aus  Ursprungdevice / ausgewertetes Reading / MAX
     my ($ts,$read,undef) = split("__",$reading,3);                              # Extraktion Timestamp, read = Reading Name zum Erstellen, Extract aus readingNameMap
     $ts      =~ /^(\d+)-(\d+)-(\d+)_(\d+)-(\d+)-(\d+)$/;                       # Aufteilung Timestamp
     my $pmts = "$1-$2-$3 $4:$5:$6";                                            # Neuzusammenstellung des Timestamp
     my $hash = $defs{$name};                                                    # hash des Zieldevices
     # readingsSingleUpdate($hash, $resr, $value, 1);                           # wenn man den aktuellen Timestamp setzt (Normalfall)
     setReadingsVal($hash,$read,$value,$pmts);                                  # !!! Spezialfall !!! abweichenden Timestamp setzen
}
return;
}


Das Reading wird im ausführenden DbRep Device erstellt. Ansonsten könntest du $name auch auf ein beliebiges Device setzen.

Grüße,
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Kai-Alfonso

Zitat von: DS_Starter am 01 November 2019, 10:21:18
Danke  :)

Habe doch etwas Zeit gefunden und auch ausprobiert. So funktioniert es


sub TempStatistik {
my ($name,$reading,$value) = @_;
my $resr;

if($reading =~ /^.*Temp.*$/) {                                            # es ist das Ergebnis aus  Ursprungdevice / ausgewertetes Reading / MAX
     my ($ts,$read,undef) = split("__",$reading,3);                              # Extraktion Timestamp, read = Reading Name zum Erstellen, Extract aus readingNameMap
     $ts      =~ /^(\d+)-(\d+)-(\d+)_(\d+)-(\d+)-(\d+)$/;                       # Aufteilung Timestamp
     my $pmts = "$1-$2-$3 $4:$5:$6";                                            # Neuzusammenstellung des Timestamp
     my $hash = $defs{$name};                                                    # hash des Zieldevices
     # readingsSingleUpdate($hash, $resr, $value, 1);                           # wenn man den aktuellen Timestamp setzt (Normalfall)
     setReadingsVal($hash,$read,$value,$pmts);                                  # !!! Spezialfall !!! abweichenden Timestamp setzen
}
return;
}


Das Reading wird im ausführenden DbRep Device erstellt. Ansonsten könntest du $name auch auf ein beliebiges Device setzen.

Grüße,
Heiko


Cool - vielen Dank. Ich würde gerne noch das $name auf das Device zeigt was in dem Reading device in dem DbRep Device zeigt  8) 8) Vielleicht könntest mir noch mal kurz unter die Arme greifen?  ;)
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

DS_Starter

Gerne ...
Du meintest sicherlich nicht Reading sondern Attribut device.
So sollte es funktionieren:


sub TempStatistik {
my ($name,$reading,$value) = @_;
my $resr;

if($reading =~ /^.*Temp.*$/) {                                            # es ist das Ergebnis aus  Ursprungdevice / ausgewertetes Reading / MAX
     my ($ts,$read,undef) = split("__",$reading,3);                              # Extraktion Timestamp, read = Reading Name zum Erstellen, Extract aus readingNameMap
     $ts      =~ /^(\d+)-(\d+)-(\d+)_(\d+)-(\d+)-(\d+)$/;                       # Aufteilung Timestamp
     my $pmts = "$1-$2-$3 $4:$5:$6";                                            # Neuzusammenstellung des Timestamp
     my $dest  = AttrVal($name, "device", "");                                # device Attribut dbrep auslesen
     my $hash = $defs{$dest};                                                        # hash des Zieldevices
     # readingsSingleUpdate($hash, $resr, $value, 1);                           # wenn man den aktuellen Timestamp setzt (Normalfall)
     setReadingsVal($hash,$read,$value,$pmts);                                  # !!! Spezialfall !!! abweichenden Timestamp setzen
}
return;
}


Du kannst dir die Syntax von AttrVal im Wiki anschauen  https://wiki.fhem.de/wiki/DevelopmentModuleAPI#AttrVal

Probier mal,
lg
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Kai-Alfonso

Zitat von: DS_Starter am 01 November 2019, 19:30:19
Gerne ...
Du meintest sicherlich nicht Reading sondern Attribut device.
So sollte es funktionieren:


sub TempStatistik {
my ($name,$reading,$value) = @_;
my $resr;

if($reading =~ /^.*Temp.*$/) {                                            # es ist das Ergebnis aus  Ursprungdevice / ausgewertetes Reading / MAX
     my ($ts,$read,undef) = split("__",$reading,3);                              # Extraktion Timestamp, read = Reading Name zum Erstellen, Extract aus readingNameMap
     $ts      =~ /^(\d+)-(\d+)-(\d+)_(\d+)-(\d+)-(\d+)$/;                       # Aufteilung Timestamp
     my $pmts = "$1-$2-$3 $4:$5:$6";                                            # Neuzusammenstellung des Timestamp
     my $dest  = AttrVal($name, "device", "");                                # device Attribut dbrep auslesen
     my $hash = $defs{$dest};                                                        # hash des Zieldevices
     # readingsSingleUpdate($hash, $resr, $value, 1);                           # wenn man den aktuellen Timestamp setzt (Normalfall)
     setReadingsVal($hash,$read,$value,$pmts);                                  # !!! Spezialfall !!! abweichenden Timestamp setzen
}
return;
}


Du kannst dir die Syntax von AttrVal im Wiki anschauen  https://wiki.fhem.de/wiki/DevelopmentModuleAPI#AttrVal

Probier mal,
lg

Super, vielen Dank. Das hat geklappt. AttrVal kenne ich, bei hapert es eher mit der genauen syntaktischen Umsetzung. Warum zum Beispiel brauche ich ein Hash des Ziel-Device und kann nicht $dest nehmen?
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

DS_Starter

#29
ZitatWarum zum Beispiel brauche ich ein Hash des Ziel-Device und kann nicht $dest nehmen?
Es kommt darauf an welche Variablen der nachfolgenden Funktion, hier ist es setReadingsVal, übergeben werden müssen.
setReadingsVal verlangt einen Hash des Zieldevices. Bei manch anderen Funktionen kann man den $name oder sogar entweder den Hash oder den Namen übergeben. Es kommt darauf an was der Programmierer der Funktion implementiert hat.
Da hilft nur ein Blick in die Doku oder direkt in die fhem.pl (bzw. wo die benutzte Funktion lokalisiert ist) 

Eigentlich müsste man auch noch prüfen, ob es einen Hash des übergebenen Devices gibt, also ob das Device überhaupt existiert. So könnte man ergänzen:


.....
     my $hash = $defs{$dest};                                                        # hash des Zieldevices
     # readingsSingleUpdate($hash, $resr, $value, 1);                           # wenn man den aktuellen Timestamp setzt (Normalfall)
     
    return if(!$hash);                                                                         # Absprung falls kein Hash vorhanden                                                           
     
     setReadingsVal($hash,$read,$value,$pmts);                                  # !!! Spezialfall !!! abweichenden Timestamp setzen
.....


oder hier noch einen entsprechenden Logeintrag vornehmen.
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter