From 33e4ababe79de8dce084d47bd1a39b137a4e53de Mon Sep 17 00:00:00 2001 From: nasseeder1 Date: Tue, 17 May 2022 18:33:12 +0000 Subject: [PATCH] 93_DbRep: allow optionally set device/reading insert command, minor fixes git-svn-id: https://svn.fhem.de/fhem/trunk@26054 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 2 + fhem/FHEM/93_DbRep.pm | 127 ++++++++++++++++++++++-------------------- 2 files changed, 68 insertions(+), 61 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index f54530a6e..8e0a50809 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,7 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - change: 93_DbRep: allow optionally set device/reading insert command, + minor fixes - feature: 70_ESCVP21net: added Epson model TW9400 - change: 98_monitoring: now packaged - change: 50_Signalbot: send message box, 0.10.5 group functions diff --git a/fhem/FHEM/93_DbRep.pm b/fhem/FHEM/93_DbRep.pm index 8ee4ffa1b..fcb9a88a0 100644 --- a/fhem/FHEM/93_DbRep.pm +++ b/fhem/FHEM/93_DbRep.pm @@ -57,6 +57,8 @@ no if $] >= 5.017011, warnings => 'experimental::smartmatch'; # Version History intern my %DbRep_vNotesIntern = ( + "8.49.0" => "16.05.2022 allow optionally set device / reading in the insert command ", + "8.48.4" => "16.05.2022 fix perl warning of set ... insert, Forum: topic,53584.msg1221588.html#msg1221588 ", "8.48.3" => "09.04.2022 minor code fix in DbRep_reduceLog ", "8.48.2" => "22.02.2022 more code refacturing ", "8.48.1" => "31.01.2022 minor fixes e.g. in file size determination, dump routines ", @@ -927,21 +929,11 @@ sub DbRep_Set { if (!$prop) { return qq{Data to insert to table 'history' are needed like this pattern: 'Date,Time,Value,[Unit]'. "Unit" is optional. Spaces are not allowed !}; } - - my $i_device = AttrVal($hash->{NAME}, "device", ""); - my $i_reading = AttrVal($hash->{NAME}, "reading", ""); - - if (!$i_device || !$i_reading) { - return qq{One or both of attributes "device", "reading" are not set. It's mandatory to set both to complete dataset for manual insert !}; - } - # Attribute device & reading dürfen kein SQL-Wildcard % enthalten - if($i_device =~ m/%/ || $i_reading =~ m/%/ ) { - return qq{One or both of attributes "device", "reading" containing SQL wildcard "%". Wildcards are not allowed in manual function insert !} - } - - my ($i_date, $i_time, $i_value, $i_unit) = split ",", $prop; - $i_unit //= ""; + my ($i_date, $i_time, $i_value, $i_unit, $i_device, $i_reading) = split ",", $prop; + $i_unit //= ""; + $i_device //= AttrVal($name, "device", ""); # Device aus Attr lesen wenn nicht im insert angegeben + $i_reading //= AttrVal($name, "reading", ""); # Reading aus Attr lesen wenn nicht im insert angegeben if (!$i_date || !$i_time || !defined $i_value) { return qq{At least data for "Date", "Time" and "Value" is needed to insert. "Unit" is optional. Inputformat is "YYYY-MM-DD,HH:MM:SS,,"}; @@ -950,6 +942,15 @@ sub DbRep_Set { if ($i_date !~ /^(\d{4})-(\d{2})-(\d{2})$/x || $i_time !~ /^(\d{2}):(\d{2}):(\d{2})$/x) { return "Input for date is not valid. Use format YYYY-MM-DD,HH:MM:SS"; } + + if (!$i_device || !$i_reading) { + return qq{One or both of "device", "reading" are not set. It's mandatory to set both in the insert command or with the device / reading attributes}; + } + + # Attribute device & reading dürfen kein SQL-Wildcard % enthalten + if($i_device =~ m/%/ || $i_reading =~ m/%/ ) { + return qq{One or both of "device", "reading" containing SQL wildcard "%". Wildcards are not allowed in manual function insert !} + } my $i_timestamp = $i_date." ".$i_time; my ($yyyy, $mm, $dd, $hh, $min, $sec) = ($i_timestamp =~ /(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/); @@ -963,13 +964,6 @@ sub DbRep_Set { $hash->{LASTCMD} = $prop ? "$opt $prop" : "$opt"; - if ($dbmodel ne 'SQLITE') { # Daten auf maximale Länge (entsprechend der Feldlänge in DbLog) beschneiden wenn nicht SQLite - $i_device = substr($i_device, 0, $hash->{HELPER}{DBREPCOL}{DEVICE}); - $i_reading = substr($i_reading, 0, $hash->{HELPER}{DBREPCOL}{READING}); - $i_value = substr($i_value, 0, $hash->{HELPER}{DBREPCOL}{VALUE}); - $i_unit = substr($i_unit, 0, $hash->{HELPER}{DBREPCOL}{UNIT}); - } - DbRep_Main ($hash, $opt, "$i_timestamp,$i_device,$i_reading,$i_value,$i_unit"); } elsif ($opt eq "exportToFile" && $hash->{ROLE} ne "Agent") { @@ -4933,21 +4927,29 @@ sub DbRep_insert { my $dbloghash = $defs{$hash->{HELPER}{DBLOGDEVICE}}; - my $bst = [gettimeofday]; # Background-Startzeit + my $bst = [gettimeofday]; # Background-Startzeit my ($err,$dbh,$dbmodel) = DbRep_dbConnect($name, 0); return $err if ($err); - # check ob PK verwendet wird, @usepkx?Anzahl der Felder im PK:0 wenn kein PK, $pkx?Namen der Felder:none wenn kein PK + # check ob PK verwendet wird, @usepkx ? Anzahl der Felder im PK : 0 wenn kein PK, + # $pkx ? Namen der Felder : none wenn kein PK my ($usepkh,$usepkc,$pkh,$pkc) = DbRep_checkUsePK($hash,$dbloghash,$dbh); my ($i_timestamp,$i_device,$i_reading,$i_value,$i_unit) = split ",", $prop; my $i_type = "manual"; my $i_event = "manual"; + + if ($dbmodel ne 'SQLITE') { # V8.48.4 - Daten auf maximale Länge (entsprechend der Feldlänge in DbLog) beschneiden wenn nicht SQLite + $i_device = substr($i_device, 0, $hash->{HELPER}{DBREPCOL}{DEVICE}); + $i_reading = substr($i_reading, 0, $hash->{HELPER}{DBREPCOL}{READING}); + $i_value = substr($i_value, 0, $hash->{HELPER}{DBREPCOL}{VALUE}); + $i_unit = substr($i_unit, 0, $hash->{HELPER}{DBREPCOL}{UNIT}); + } Log3 ($name, 5, "DbRep $name -> data to insert Timestamp: $i_timestamp, Device: $i_device, Type: $i_type, Event: $i_event, Reading: $i_reading, Value: $i_value, Unit: $i_unit"); - my $st = [gettimeofday]; # SQL-Startzeit + my $st = [gettimeofday]; # SQL-Startzeit my ($sth,$sql,$irow); @@ -13916,25 +13918,27 @@ return;
-
  • insert <Datum,Zeit,Value,[Unit]> - - Manual insertion of a record into the "history" table. Mandatory are input values for Date, Time and Value. - The values for the DB fields TYPE and EVENT are filled with "manual", and the values for - DEVICE, READING are taken from the set attributes - device bzw. reading. +
  • insert <Date>,<Time>,<Value>,[<Unit>],[<Device>],[<Reading>] + - Manual insertion of a data record into the table "history". Input values for date, time and value are obligatory. + The values for the DB fields TYPE and EVENT are filled with "manual".
    + If Device, Reading are not set, these values are taken from the corresponding + attributes device, reading.

    -
      - Example:
      - set <name> insert 2016-08-01,23:00:09,12.03,kW
      - set <name> insert 2021-02-02,10:50:00,value with space
      -
    + Note:
    + Unused fields within the insert command must be enclosed within the string in "," + within the string. +

    - Note:
    - Please consider to insert AT LEAST two datasets into the intended time / aggregatiom period (day, week, month, etc.) because of - it's needed by function diffValue. Otherwise no difference can be calculated and diffValue will be print out "0" for the respective period ! -
    -
    +
      + Examples:
      + set <name> insert 2016-08-01,23:00:09,12.03,kW
      + set <name> insert 2021-02-02,10:50:00,value with space
      + set <name> insert 2022-05-16,10:55:00,1800,,SMA_Wechselrichter,etotal
      + set <name> insert 2022-05-16,10:55:00,1800,,,etotal
      +
    +
    The relevant attributes to control this function are:

    @@ -16213,29 +16217,29 @@ return; gekennzeichnet:

      2017-11-25_00-00-05__eg.az.fridge_Pwr__power 0
      - 2017-11-25_00-02-26__eg.az.fridge_Pwr__power 0
      - 2017-11-25_00-04-33__eg.az.fridge_Pwr__power 0
      - 2017-11-25_01-06-10__eg.az.fridge_Pwr__power 0
      + 2017-11-25_00-02-26__eg.az.fridge_Pwr__power 0
      + 2017-11-25_00-04-33__eg.az.fridge_Pwr__power 0
      + 2017-11-25_01-06-10__eg.az.fridge_Pwr__power 0
      2017-11-25_01-08-21__eg.az.fridge_Pwr__power 0
      2017-11-25_01-08-59__eg.az.fridge_Pwr__power 60.32
      2017-11-25_01-11-21__eg.az.fridge_Pwr__power 56.26
      2017-11-25_01-27-54__eg.az.fridge_Pwr__power 6.19
      2017-11-25_01-28-51__eg.az.fridge_Pwr__power 0
      - 2017-11-25_01-31-00__eg.az.fridge_Pwr__power 0
      - 2017-11-25_01-33-59__eg.az.fridge_Pwr__power 0
      + 2017-11-25_01-31-00__eg.az.fridge_Pwr__power 0
      + 2017-11-25_01-33-59__eg.az.fridge_Pwr__power 0
      2017-11-25_02-39-29__eg.az.fridge_Pwr__power 0
      2017-11-25_02-41-18__eg.az.fridge_Pwr__power 105.28
      2017-11-25_02-41-26__eg.az.fridge_Pwr__power 61.52
      2017-11-25_03-00-06__eg.az.fridge_Pwr__power 47.46
      2017-11-25_03-00-33__eg.az.fridge_Pwr__power 0
      - 2017-11-25_03-02-07__eg.az.fridge_Pwr__power 0
      - 2017-11-25_23-37-42__eg.az.fridge_Pwr__power 0
      + 2017-11-25_03-02-07__eg.az.fridge_Pwr__power 0
      + 2017-11-25_23-37-42__eg.az.fridge_Pwr__power 0
      2017-11-25_23-40-10__eg.az.fridge_Pwr__power 0
      2017-11-25_23-42-24__eg.az.fridge_Pwr__power 1
      - 2017-11-25_23-42-24__eg.az.fridge_Pwr__power 1
      + 2017-11-25_23-42-24__eg.az.fridge_Pwr__power 1
      2017-11-25_23-45-27__eg.az.fridge_Pwr__power 1
      2017-11-25_23-47-07__eg.az.fridge_Pwr__power 0
      - 2017-11-25_23-55-27__eg.az.fridge_Pwr__power 0
      + 2017-11-25_23-55-27__eg.az.fridge_Pwr__power 0
      2017-11-25_23-48-15__eg.az.fridge_Pwr__power 0
      2017-11-25_23-50-21__eg.az.fridge_Pwr__power 59.1
      2017-11-25_23-55-14__eg.az.fridge_Pwr__power 52.31
      @@ -16718,27 +16722,28 @@ return;
      -
    • insert <Datum,Zeit,Value,[Unit]> +
    • insert <Datum>,<Zeit>,<Value>,[<Unit>],[<Device>],[<Reading>] - Manuelles Einfügen eines Datensatzes in die Tabelle "history". Obligatorisch sind Eingabewerte für Datum, Zeit und Value. - Die Werte für die DB-Felder TYPE bzw. EVENT werden mit "manual" gefüllt, sowie die Werte für - DEVICE, READING aus den gesetzten Attributen device bzw. reading - genommen. + Die Werte für die DB-Felder TYPE bzw. EVENT werden mit "manual" gefüllt.
      + Werden Device, Reading nicht gesetzt, werden diese Werte aus den entsprechenden + Attributen device bzw. reading genommen.

      + Hinweis:
      + Nicht belegte Felder innerhalb des insert Kommandos müssen innerhalb des Strings in "," + eingeschlossen werden. +
      +
      +
        Beispiel:
        - set <name> insert 2016-08-01,23:00:09,12.03,kW
        - set <name> insert 2021-02-02,10:50:00,value with space
        + set <name> insert 2016-08-01,23:00:09,12.03,kW
        + set <name> insert 2021-02-02,10:50:00,value with space
        + set <name> insert 2022-05-16,10:55:00,1800,,SMA_Wechselrichter,etotal
        + set <name> insert 2022-05-16,10:55:00,1800,,,etotal

      - Hinweis:
      - Bei der Eingabe ist darauf zu achten dass im beabsichtigten Aggregationszeitraum (Tag, Woche, Monat, etc.) MINDESTENS zwei - Datensätze für die Funktion diffValue zur Verfügung stehen. Ansonsten kann keine Differenz berechnet werden und diffValue - gibt in diesem Fall "0" in der betroffenen Periode aus ! -
      -
      - Die für diese Funktion relevanten Attribute sind: