[gelöst] DbLog mit SQLite: mysql Befehle anpassen Timestamp und duplicate Key

Begonnen von jnewton957, 30 November 2023, 19:56:25

Vorheriges Thema - Nächstes Thema

jnewton957

Hallo,

ich habe "damals" die DbLog mit SQLite eingerichtet. Bisher klappt das auch alles wunderbar.

Nun habe ich hier bei einem Post eine Umsetzung mit einem userreading, welches jedoch MySQL Befehle benutzt.
Einen Großteil konnte ich schon von MySQL auf SQP Befehle umstellen.

Bei nachfolgenden statements komme ich nicht weiter und hoffe auf Hilfe.

1. MySQL
INSERT INTO history (TIMESTAMP,DEVICE,TYPE,READING,VALUE)
                VALUES('".$timestamp."','$NAME','$TYPE','consumption','".$value."')
              [b]ON DUPLICATE KEY UPDATE[i][/i][/b]
                VALUE='".$value."';") ;

Es geht um das ON DUPLICATE KEY UPDATE:
Irgendwie klappt das SQLite: ON CONFLICT DO UPDATE SET VALUE='".$value."';") nicht.


2.MYSQL
SELECT cast(sum(VALUE) AS DECIMAL(10,4)) FROM history
           WHERE DEVICE='".$NAME."'\
             AND READING='consumption'
             AND YEAR(TIMESTAMP) = YEAR(curdate())
             AND DAY(TIMESTAMP) = curdate()
             AND MONTH(TIMESTAMP) = MONTH(curdate()) ;") ;

curdate ist date('now'). MONTH(curdate()) ist strftime('%m','now') und YEAR(curdate()) ist strftime('%Y','now').
Aber der Vergleich/Selektion des select where DAY(TIMESTAMP) mit einer Zeitvariablen habe ich nicht gefunden.

3. Ich habe ein reading : nodes_00_00_from mit Wert: 2023-11-30 18:00:00
Wie könnte ich daraus das obige where "bauen"??

Wie müsste ich das "umschreiben", damit ich das trotzdem in SQLite verwenden kann.

Danke
Jörg
FHEM6.2 auf Pi5
V 1.66 nanoCUL 433 (IT)
V 1.66 nanoCUL868 (HM)
sqlite3 LogDb
ELRO AB440, DECT200,  TFA30.3125, esp8266, HM, TabletUI, IR-Schreiblesekopf (Udo),tibber Pulse, Kostal Pico, cfos Wallbox, Modbus TCP

ch.eick

RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

jnewton957

Eine Übersetzung scheint "ON CONFLICT() DO UPDATE SET " zu sein.

Dank der Info von ch.eick habe ich nun zwei dbRep daraus gemacht und eben einmal das insert into und vorher ein delete from.

Somit habe ich einen workaround gefunden.
FHEM6.2 auf Pi5
V 1.66 nanoCUL 433 (IT)
V 1.66 nanoCUL868 (HM)
sqlite3 LogDb
ELRO AB440, DECT200,  TFA30.3125, esp8266, HM, TabletUI, IR-Schreiblesekopf (Udo),tibber Pulse, Kostal Pico, cfos Wallbox, Modbus TCP

horchundkuck

#3
Da ich auch SQLite nutze und gerade fest hänge, und obwohl das Thema "gelöst" ist, habe ich dazu noch eine Frage:

ON DUPLICATE ließ sich mit dem verlinkten Tipp von @ch.eick gefunden, nur leicht korrigiert (es war ja ungetestet) funktioniert dies:
    ::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking
                        DELETE FROM history
                          WHERE
                            TIMESTAMP = '".$timestamp."',
                            DEVICE = '".$NAME."',
                            READING = 'fc".$loop_fc."_total';") ;

    ::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking
                        INSERT INTO history (TIMESTAMP,DEVICE,TYPE,READING,VALUE)
                          VALUES('".$timestamp."','$NAME','Tibber','fc".$loop_fc."_total','".$value."');") ;
Soweit okay.
DAY(TIMESTAMP)
habe ich mit
nodes_consumption_day:nodes_TIMESTAMP.* {
## Berechnung des Tages Verbrauches
::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking
          SELECT cast(sum(VALUE) AS DECIMAL(10,4)) FROM history
          WHERE DEVICE='".$NAME."'
            AND READING='nodes_consumption'
            AND date(TIMESTAMP) = date('now') ;") ;
},
gelöst. Das passt ziemlich genau zu den Daten in der Tibber-App.

Frage @jnewton957
Wie hast du YEAR und MONTH gelöst? Die Berechnung passt da bei mir gar nicht.

Sonnige Grüße
Heinz

jnewton957

Zitat von: horchundkuck am 06 März 2024, 19:51:56Frage @jnewton957
Wie hast du YEAR und MONTH gelöst? Die Berechnung passt da bei mir gar nicht.



Etwas umständlich vielleicht - funktioniert aber:
nodes_consumption_month:nodes_TIMESTAMP.* {
my $timeiso = strftime("%F",localtime(time))." 00:00";
my ($year_today,$mon_today,$day_today) = $timeiso =~ m/(\d\d\d\d)-(\d\d)-(\d\d)/;
my $timestamp_month = "$year_today-$mon_today-01 00:00:00";
## Berechnung des Monats Verbrauches
fhem("get LogDBRep_EVU_Tibber_connect_SQL sqlCmdBlocking SELECT CAST(sum(VALUE) AS DECIMAL(10,4)) FROM history WHERE DEVICE='EVU_Tibber_connect' AND READING='nodes_consumption' AND TIMESTAMP >= '".$timestamp_month."' ;") ;
},

für Jahr analog angepasst:
my $timestamp_year = "$year_today-01-01 00:00:00";
FHEM6.2 auf Pi5
V 1.66 nanoCUL 433 (IT)
V 1.66 nanoCUL868 (HM)
sqlite3 LogDb
ELRO AB440, DECT200,  TFA30.3125, esp8266, HM, TabletUI, IR-Schreiblesekopf (Udo),tibber Pulse, Kostal Pico, cfos Wallbox, Modbus TCP