[bug] DbRep: changeValue funktioniert nicht mit Zielwert 0

Begonnen von betateilchen, 01 Dezember 2024, 10:52:21

Vorheriges Thema - Nächstes Thema

betateilchen

Moin,

der Versuch, in der Datenbank vorhandene Werte "off" durch 0 zu ersetzen

set dbrep changeValue old="off" new="0"
scheitert mit der Fehlermeldung

Both entries old="old string" new="new string" are needed.
Offenbar berücksichtigt die Fehlerbehandlung im Modul

  elsif ($opt =~ /changeValue/) {
      my ($ac, $hc) = parseParams(join ' ', @a);

      my $oldval = $hc->{old};
      my $newval = $hc->{new};

      if (!$oldval || !$newval) {
          return qq{Both entries old="old string" new="new string" are needed.};
      }

nicht, dass es durchaus einen gewünschten Wert 0 geben kann.

!$newval ergibt eben true, wenn $newval == 0

(Das gleiche Verhalten dürfte auch bei oldval == 0 auftreten)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

DS_Starter

Hallo betateilchen,

danke für die Info.

Das ist natürlich so nicht gewünscht.
Ändere ich in

if (!defined $oldval || !defined $newval) {
...

Das sollte dann passen.

LG
 
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

DS_Starter

Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

betateilchen

ähm... ich glaube nicht, dass die Lösung so einfach ist.

Hast Du sowas mal probiert:

set dbrep changeValue old="off" new=
Syntaktisch falsch, aber dbrep löscht damit kommentarlos die vorhandenen Werte, was ich auch nicht für richtig halte.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

DS_Starter

Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

DS_Starter

 
if ($oldval eq '' || $newval eq '') {
...

sollte es tun.
Teste gerade ein paar Szenarien.

Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

DS_Starter

Sieht gut für mich aus.
Habe die V ins Repo gestellt. Kannst gerne von deiner Seite aus gegenchecken.
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

betateilchen

Kann man so machen, aber warum die Prüfung nicht einfach frühestmöglich machen?
Dein Ansatz mit defined() war ja grundsätzlich gut, nur zu spät.

  elsif ($opt =~ /changeValue/) {
      my ($ac, $hc) = parseParams(join ' ', @a);

if (!defined($hc->{old}) || !defined($hc->{new})) {
          return qq{Both entries old="old string" new="new string" are needed.};
}

      my $oldval = $hc->{old};
      my $newval = $hc->{new};
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!