Datenbank loggt Einträge nicht

Begonnen von wowogiengen, 22 September 2024, 21:14:07

Vorheriges Thema - Nächstes Thema

wowogiengen

Eins hab ich noch :-)

Die Readings kann man so nicht in die Grafik umsetzen, da vornedran immer 100 dran steht, und später dann erst 0, oder andersrum:

statLevelHour     --> 0: 00:43:51 0_Count: 3 100: 00:05:14 100_Count: 2
statLevelHourLast --> 0: 01:00:00 0_Count: 1

Wie bekomme ich jetzt die Werte für den SVG-Plot raus? Am liebsten wäre es mir, wenn bei der vollen Stunde dann ein Reading erzeugt würde, das sagt, letzte Stunde 45 Minuten aus, und das andere dann letzte Stunde 15 Minuten an...

Aber das kann man auch später machen, wenn wir mehr Zeit haben :-)

DS_Starter

ZitatWie bekomme ich jetzt die Werte für den SVG-Plot raus?
Diese Frage hat aber nichts mehr mit dem Logging zu tun und wäre ein neues Thema im SVG-Thread.  ;)

ZitatAm liebsten wäre es mir, wenn bei der vollen Stunde dann ein Reading erzeugt würde, das sagt, letzte Stunde 45 Minuten aus, und das andere dann letzte Stunde 15 Minuten an...
Auch das wäre etwas für den Thread des Statistik-Moduls.

Ansonsten bietet DbLog das Attr valueFn an, mit dem man diverse Manipulationen machen kann.
Geht es bei der speziellen Anforderung nur um das Reading "statLevelHour"?
Proxmox+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

wowogiengen

Hallo DS_Starter,
ich habe die Einträge aus der DB für den Aktor im Bad mal als JSON-File exportiert und angehängt.
Das Reading ist immer "statLevelHourLast" (einmal am Tag dann auch "statLevelDayLast", aber sonst wohl identisch...
Die Values sind dann:
- (wenn sowohl 0 als auch 100 % an Level in 1h gemessen wurden).Der Aktor war also 54 Minuten aus, und 5m20 an.
  "0: 00:54:40 0_Count: 2 100: 00:05:20 100_Count: 1"
- Wenn nur der Level 0% gemessen wurde, war der Aktor 1h lang aus
  "0: 01:00:00 0_Count: 1"
- Wenn nur der Level 100% gemessen wurde, war der Aktor 1h lang an:
  "100: 01:00:00 100_Count: 1"

Wie kann ich nun diese Values nehmen, und daraus dann ein SVG-Plot erstellen. Irgendeine Logik müsste ja noch rein, um die Values auseinanderzuklamüsern. Ob man das bereits beim Eintragen in die DB macht, oder erst wenn man die Werte wieder braucht, ist mir relativ egal.

Am Beispiel des ersten Values könnte man ja für den Zeitpunkt des Events dann je ein Reading erstellen,
und zwar
"statLevelHourLast_Off" für "0: 00:54:40 0_Count: 2", mit dem Value "00:54:40"
und
"statLevelHourLast_On" für "0: 00:05:20 0_Count: 1", mit dem Value "00:05:20"

wenn "0: xxx" oder "100:yyy" im Value vorkommt, wird auch das neue Reading nicht erzeugt...

Aber ich kann das ganze auch gerne in die SVG- oder DbLog-Foren rübernehmen...

DS_Starter

ZitatAm Beispiel des ersten Values könnte man ja für den Zeitpunkt des Events dann je ein Reading erstellen,
und zwar
"statLevelHourLast_Off" für "0: 00:54:40 0_Count: 2", mit dem Value "00:54:40"
und
"statLevelHourLast_On" für "0: 00:05:20 0_Count: 1", mit dem Value "00:05:20"
Du hast dir die Lösung doch schon selbst bereitgelegt. Stichwort ist userReadings. Damit kannst du dir ausgehend vom Reading statLevelHourLast mit ein wenig Code die neuen Readings statLevelHourLast_Off und statLevelHourLast_On erzeugen und diese dann loggen.
Proxmox+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

wowogiengen

Ich hab genau 1 userReading in meiner FHEM-Installation (in den PWMR-Devices), das hab ich wohl aus dem Wiki oder Forum geholt...
aber ich versteh die Sprache nicht... deswegen meine Frage:

openval {
  my @devices = split(' ', InternalVal($name,'DEF',1));
    splice(@devices,0,1);
  my $openvalue = 0;
 
  foreach my $device (@devices){
    $openvalue += ReadingsVal($device, 'PID_PWMPulse', 0);
  }
 
  return sprintf("%.1f",($openvalue/@devices));
},
energy {
  my @devices = split(' ', InternalVal($name,'DEF',1));
    splice(@devices,0,1);
  my $energyusedp= 0;
 
  foreach my $device (@devices){
    $energyusedp += ReadingsVal($device, 'energyusedp', 0);
  }
 
  return sprintf("%.1f",($energyusedp /@devices));
}

Welche Sprache wäre dass denn, dann kann ich mich mal genauer einlesen - führt ja eh kein Weg dran vorbei.

DS_Starter

Wir sind mit Perl unterwegs. Es gibt etliche FHEM-eigene Funktionen wie z.B. ReadingsVal. Sie sind im Wiki beschrieben.
Und userReadings ist in der ComRef beschrieben.

Es gibt bestimmt viele User die hier unterstützen können. Ich würde dir aber empfehlen einen neuen Thread mit dem Thema der Erstellung von userReadings und deiner speziellen Anforderung zu erstellen.

LG,
Heiko
Proxmox+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

wowogiengen

Hallo,
letzte Frage hoffentlich hier :-)

Ich hab jetzt mal mit Perl bisschen was gemacht (Du darfst diesen Dateianhang nicht ansehen.),

Das scheint mir ganz passend zu sein...

Die 3 Eingabevarianten:
"0: 00:22:14 0_Count: 3 100: 00:04:05 100_Count: 2"
"0: 00::00 0_Count: 3"
"100: 00:04:05 100_Count: 2"
verwende ich, um die Funktion zu testen.

my @eingabe = (
"0: 00:22:14 0_Count: 3 100: 00:04:05 100_Count: 2",
"100: 00:04:05 100_Count: 2",
"0: 00:22:14 0_Count: 3"
);
foreach my $item (@eingabe){
print ("Test für ".$item."\n");
my $result =  SplitReading($item);
print @$result[0]->[0]."=".@$result[0]->[1]."\n";
print @$result[1]->[0]."=".@$result[1]->[1]."\n";
}


Aus @result[0] lese ich die Zeitdauer in Sekunden für den Zustand Aus
Aus @result[1] lese ich die Zeitdauer in Sekunden für den Zustand Ein

Aber wie bekomme ich jetzt FHEM und die Perl-Datei zusammen?
Ich weiß, dass man die Perl-Funktion in irgendeine myutils.pl oder so einfügen kann...


DS_Starter

Es gibt im Verz. ../opt/fhem/FHEM die Datei myUtilsTemplate.pm die man als 99_myUtils.pm speichert.

##############################################
# $Id: myUtilsTemplate.pm 21509 2020-03-25 11:20:51Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

# Enter you functions below _this_ line.


1;

In dieser Datei kannst du eigene Funktionen einbauen.
In userReadings kannst du ebenfalls Perl Code direkt einfügen wenn er nicht so umfangreich ist. Was umfangreich ist liegt in deinem Ermessen.
Proxmox+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

wowogiengen

Hallo,
das Userreading sieht so aus:

statLevelHourLast_0
{
my $item = ReadingsVal("HzgAktorBuero","statLevelHourLast",0);
return $item;
my $result_0 =  SplitReading($item,0);
my $result_100 =  SplitReading($item,100);
return $result_0[0]->[0];
}
statLevelHourLast_100
{
my $item = ReadingsVal("HzgAktorBuero","statLevelHourLast",0);
my @result_0 =  SplitReading($item,0);
my @result_100 =  SplitReading($item,100);
return $result_100[0]->[0];
}

aber das gibt einen Fehler:

statLevelHourLast_0
Error evaluating HzgAktorBuero userReading statLevelHourLast_0: Global symbol "@result_0" requires explicit package name (did you forget to declare "my @result_0"?) at (eval 1895) line 6.
Global symbol "@result_100" requires explicit package name (did you forget to declare "my @result_100"?) at (eval 1895) line 13.

Wie muss ich die Variablen benennen?

DS_Starter

my $result_0 -> my @result_0

Aber ...

statLevelHourLast_0
{
   my $item = ReadingsVal("HzgAktorBuero","statLevelHourLast",0);
   return $item;
   my $result_0 =  SplitReading($item,0);
   my $result_100 =  SplitReading($item,100);
   return $result_0[0]->
  • ;
}

Das erste return geht schon zum Ausgang.
Proxmox+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

wowogiengen

Ich hab jetzt rumprobiert, bis es geht:

statLevelHourLast_0
{
my $item = ReadingsVal("HzgAktorBuero","statLevelHour",0);
my $result = SplitReading($item,0);
return $result->[0]->[1];
},
statLevelHourLast_100
{
my $item = ReadingsVal("HzgAktorBuero","statLevelHour",0);
my $result = SplitReading($item,100);
return $result->[0]->[1];
}


blackbox.ai hat mir bei perl auch geholfen :-)

DS_Starter

Auch verstanden was passiert? Das wäre eigentlich noch viel wichtiger.  ;)
Proxmox+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

wowogiengen

Hallo DS_Starter,

ich glaub, das sind noch Anfängerprobleme mit perl...
Wann man @ und wann man $ verwendet und wann dann /@...
und die ganzen RegExp sind auch so ein Thema...
Und dann kommt noch FHEM als solches dazu.
Ich hab das userreading jetzt für dieses eine device explizit geschrieben.
Aber man kann das ja sicher universell machen, für jedes device, wo ich das neue Reading brauche...
Das werd ich dann am WE ausprobieren.

DS_Starter

Du machst das schon gut. Wollte dich nur ermuntern dran zu bleiben und nicht nur die AI zu befragen um sich darauf zu verlassen und keine eigenen Gedanken zu machen.  :)
Es gibt hier auch eine Perl-Ecke im Forum.
Proxmox+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

wowogiengen

Hallo,
das userreading läuft jetzt schon ne ganze Weile mit. Aber wie es aussieht, schreibt es sehr viele Events in die DB, und die Auslastung von FHEM ist höher als normal. Fast schon nicht mehr bedienbar...

(about:invalid)

Sieht zwar nicht nach viel aus, aber irgendwie stimmt da was nicht...
hab jetzt das userreading mit # im Wert mal wieder abgehängt...