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
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
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.
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
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";