FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: jnewton957 am 30 November 2023, 19:56:25

Titel: [gelöst] DbLog mit SQLite: mysql Befehle anpassen Timestamp und duplicate Key
Beitrag von: jnewton957 am 30 November 2023, 19:56:25
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
Titel: Aw: DbLog mit SQLite: mysql Befehle anpassen Timestamp und duplicate Key
Beitrag von: ch.eick am 06 Dezember 2023, 15:58:31
Moin,

puh, ich habe den Post auch gefunden ;-)

Hier habe ich Dir meinen Vorschlag mal rein geschrieben. (https://forum.fhem.de/index.php?msg=1295992)

VG  Christian
Titel: Aw: DbLog mit SQLite: mysql Befehle anpassen Timestamp und duplicate Key
Beitrag von: jnewton957 am 06 Dezember 2023, 17:53:35
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.
Titel: Aw: [gelöst] DbLog mit SQLite: mysql Befehle anpassen Timestamp und duplicate Key
Beitrag von: horchundkuck am 06 März 2024, 19:51:56
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
Titel: Aw: [gelöst] DbLog mit SQLite: mysql Befehle anpassen Timestamp und duplicate Key
Beitrag von: jnewton957 am 27 März 2024, 19:32:18
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";