MAX und DbLog (falscher Eintrag)

Begonnen von Dek, 11 März 2015, 22:19:52

Vorheriges Thema - Nächstes Thema

Dek

Hallo zusammen,

ich habe eben erfolgreich ein MySQL Server mit fhem verbunden. Er schreibt auch fleissig Werte in die Datenbank. Allerdings meiner Ansicht nach falsch!

definiert habe ich den Vorgang so:

define myDbLog DbLog ./db.conf (WZ.Thermostat:(desiredTemperature|temperature|smoothTemp).*|WZ.Sofa:maxValveSetting.*|WZ.Fenster:maxValveSetting.*|WZ.PID.*)


Das erzeugt in der Datenbank komische Einträge, die dann beim plot erzeugen auch falsch interpretiert werden.

mysql> select * from history;
+---------------------+---------------+-------+---------------------------------+--------------------+--------------------+-------+
| TIMESTAMP           | DEVICE        | TYPE  | EVENT                           | READING            | VALUE              | UNIT  |
+---------------------+---------------+-------+---------------------------------+--------------------+--------------------+-------+
| 2015-03-11 22:05:33 | WZ.Sofa       | MAX   | maxValveSetting 4               | state              | maxValveSetting 4  |       |
| 2015-03-11 22:05:33 | WZ.Fenster    | MAX   | maxValveSetting 4               | state              | maxValveSetting 4  |       |
| 2015-03-11 22:06:36 | WZ.Thermostat | MAX   | temperature: 21.2               | temperature        | 21.2               | °C   |
| 2015-03-11 22:06:36 | WZ.Thermostat | MAX   | desiredTemperature: 21.0        | desiredTemperature | 21.0               | °C   |
| 2015-03-11 22:06:36 | WZ.Thermostat | MAX   | smoothTemp: 21.203              | smoothTemp         | 21.203             | °C   |


Wz.Sofa und WZ.Fenster sind beide vom Typ "HeatingThermostatPlus ". Ich erwarte bei Value nur eine 4 und nicht noch den readingnamen.

Ist das ein Fehler im MAX Modul oder im DbLog?

Gruß
Dek


Tobias

Dieser Typ ist nicht explizit im dblog behandelt.  Korrekt wäre das splitting im max Modul bereitzustellen

Gesendet von meinem ALCATEL ONE TOUCH 997D mit Tapatalk

Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

juniormajor

Bin gerade über das gleiche Thema gestolpert... Umstellung auf DbLog... gplots umgebaut, und siehe da irgendwas stimmt nicht.
Also mal auf die Suche gemacht, und mir mal alte Logs im Vergleich angesehen.
Ergebnis hierbei ist, dass auch schon vor der Umstellung auf DbLog in den FileLogs bei einigen Readings ein ":" in den Logs landet, und bei einigen eben nicht.

Beim weiter Eingrenzen und Nachwassern bin ich über folgendes Verhalten der 10_MAX gestolpert:
Usecase: Einen Raum (2 HT, 1 WT) via WT in fhem in ECO versetzt.
MAX ruft die readingsBulkUpdate mit "eco" auf -> 1. Event welches geloggt wird (ohne ":")
Die beiden HT ziehen auf "eco" nach -> 2. & 3. Event wird geloggt (ohne ":")
Und dann kommt nochmal der WT  -> 4. Event (mit ":")

2015-01-17_00:01:43 AZ_Steuerung desiredTemperature eco
2015-01-17_00:01:43 AZ_Thermostat_L desiredTemperature eco
2015-01-17_00:01:43 AZ_Thermostat_R desiredTemperature eco
2015-01-17_00:01:54 AZ_Steuerung desiredTemperature: 19.0


Ob beim ersten Aufruf (aus fhem) eine Temperatur, oder ein alias (eco, auto, comfort) gewählt wird, ändert dabei nichts.

Aufgefallen ist es mir erst im Zuge des Umzuges nach DbLog, weil in den FileLogs der Unterschied des ":" in der Auswertung nicht auffällt, da die Trennung mit "blanks" stattfindet.
Dementsprechend glaube ich nicht, dass es in der DbLog liegt (in den FileLogs ist es ja auch schon), sondern dass irgendwie in der 10_MAX beim Aufruf der "readingsBulkUpdate" etwas nicht passt, denn die Events welche zum Logging führen werden ja durch die "readingsBulkUpdate" getriggert.

lG

juniormajor

Da ich mich nun endlich mal ein wenig länger damit beschäftigen konnte, mal auf die Schnelle ein paar Zeilen in der 10_MAX.pm ausprobiert.

sub
MAX_DbLog_splitFn($) {
  my ($event) = @_;
  my ($reading, $value, $unit) = "";
 
  my @parts = split(/ /,$event);
  $reading = shift @parts;
  $reading =~ tr/://d;
  $value = $parts[0];
  $unit= "\xB0C" if(lc($reading) =~ m/temp/);
  $unit= "%" if(lc($reading) =~ m/valve/);
  $unit= "%" if(lc($reading) =~ m/onoff/);
  return ($reading, $value, $unit);
}


P.S. Und ja, ich bin kein Perl-Spezialist - es wird sicher bessere/sauberere/schnellere/etc. Lösungen geben. Aber für mich und meine Anforderungen funktioniert es ausreichend gut. Mal sehen für wie lange... ;-)

ingo1870

Hallo,

$unit= "\xB0C" if(lc($reading) =~ m/temp/);
musste ich in $unit = "°C" if(lc($reading) =~ m/temp/); ändern.  (Editiert als UTF-8)

Sonst bekam ich die Meldung:
2020.03.14 21:20:31 2: DbLog mainLog -> Error table history - DBD::mysql::st execute_array failed: executing 1388 generated 9 errors at ./FHEM/93_DbLog.pm line 2608.