Wetterprognosen mit JsonMod

Begonnen von Pnemenz, 15 November 2024, 11:01:39

Vorheriges Thema - Nächstes Thema

Pnemenz

Nachdem ich die Prognosen alle 12 Stunden bekomme, habe ich mit der  "set ... addCacheLine ..." Methode, die super Funktioniert, Duplikate. Gibt es mit FHEM Bordmtteln eine Möglichkeit bereits vorhandene Daten zu aktualisieren? Das Kriterium wäre mEn Timestamp Device Reading ist vorhanden.

ch.eick

#16
Moin
In meinem EVU_Tibber_connect Device habe ich hier mal ein Beispiel aus den userRedings mit einem SQL INSERT und ON DUPLICATE KEY UPDATE
fc_DbLog:fc0_00_total.* {
my ($timestamp,$date,$hour,$value,$loop_fc_next) = 5x0;

for (my $loop_fc = 0; $loop_fc <= 1; $loop_fc++) {
  $loop_fc_next = $loop_fc +1;
  $date = ReadingsVal("$NAME","fc".$loop_fc."_00_startsAt","null");
  if ($date ne "null" and $date ne "") {
    $date =~ /([\d+-]+)/; $date = $1 ;
    for (my $loop_hour = 0; $loop_hour <= 23; $loop_hour++) {
      $hour = sprintf("%02d",$loop_hour);
      $timestamp = $date." ".$hour.":00:00";
      $value = ReadingsVal("$NAME","fc".$loop_fc."_".$hour."_total","null");
      ::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking
                        INSERT INTO history (TIMESTAMP,DEVICE,TYPE,READING,VALUE)
                          VALUES('".$timestamp."','$NAME','Tibber','fc".$loop_fc."_total','".$value."')
                        ON DUPLICATE KEY UPDATE
                          VALUE='".$value."';") ;
    }
    if (ReadingsVal("$NAME","fc".$loop_fc."_00_startsAt","null") eq ReadingsVal("$NAME","fc".$loop_fc_next."_00_startsAt","null")) {
      fhem("deletereading $NAME fc".$loop_fc_next."_.*");
    }
  } else {
      fhem("deletereading $NAME fc1_.*");
  }
}
ReadingsTimestamp("$NAME","fc0_00_startsAt","null");
},

Das läuft über eine Schleife mit fc readings und verwendet ein DbRep Device zum Schreiben ins DbLog. Da ich pro Device ein separates DbRep verwende wird der Name generiert.
Aber Achtung,  ich verwende eine Oracle MySQL Datenbank im Docker Container,  damit ich den vollen MySQL Umfang zur Verfügung habe. Bei SQLite sind Kommandos anders oder auch komplett nicht verfügbar.

Nicht mehr gültige readings werden im Device dann auch noch gelöscht, falls die forecasts nicht mehr aktuell sind. Das ist aber nur im übertragenen Sinne als Beispiel anzusehen.

VG Christian
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

betateilchen

Zitat von: Pnemenz am 19 November 2024, 21:07:30Gibt es mit FHEM Bordmtteln eine Möglichkeit bereits vorhandene Daten zu aktualisieren?

Vor dem Schreiben prüfen, ob es schon einen Wert mit dem TimeStamp gibt, wenn ja, löschen und erst dann schreiben. Geht vermutlich sowohl direkt im DbLog-device

get <name> ReadingsVal [Timestamp] <Device> <Reading> <default>
wie auch per DbRep.

Mach Dir halt mal die Mühe, die commandref zu DbLog vollständig zu lesen. Es lohnt sich.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Pnemenz

Danke für Eure Antworten, @betateilchen: ich verwende DbLog seit 2014, anscheinend habe ich da einige Änderungen verschlafen bzw. als nicht Programmierer auch nicht komplett verstanden.
@ch.eick:  danke für diesen Codeschnippsel, konnte ich für meine Bedürftnisse anpassen.

betateilchen

Zitat von: Pnemenz am 21 November 2024, 10:00:52ich verwende DbLog seit 2014, anscheinend habe ich da einige Änderungen verschlafen

inzwischen gibt es elektrischen Strom und Tonfilm...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Pnemenz

ist wenigsten das Fernsehen noch schwarz-weiß und nur 2 Programme?