Zahlenvergleich ergibt falschen Wert, obwohl Zahlen anscheinend gleich sind

Begonnen von Rewe2000, 19 März 2025, 11:23:31

Vorheriges Thema - Nächstes Thema

Rewe2000

Hallo,

wer kann mir dieses Verhalten in einem doif unter Fhem erklären.

Ich vergleiche die Lamellenstellung meines Raffstores (HmIP-BBL-2 - HMCCUDEV) mit einen festen Sollwert in einem doif im Perlmodus, obwohl beide Zahlen anscheinend identisch sind, wird der Vergleich als ungleich erkannt.
Gibt es eine Möglichkeit die Zahlen irgendwo im Rohwert darzustellen, denn irgendwie müssen sich diese ja unterscheiden, sonst wäre ja der Vergleich in Perl korrekt.

Anbei ein list vom Rollodevice, mit dem entsprechenden Reading (pct), so wie dieses aktuell datgestellt wird:
Internals:
   DEF        0036E0C9AEC667  sd=3.LEVEL cd=4.LEVEL
   FUUID      6697c185-f33f-7df9-238c-47e20402ac5c8222
   IODev      CCU2
   NAME       OG_RA01_BueroReinhard_3
   NR         580
   STATE      50
   TYPE       HMCCUDEV
   ccuaddr    0036E0C9AEC667
   ccudevstate active
   ccuif      HmIP-RF
   ccuname    OG_RA01_BueroReinhard
   ccurolectrl BLIND_VIRTUAL_RECEIVER
   ccurolestate BLIND_TRANSMITTER
   ccusubtype BBL
   ccutype    HmIP-BBL-2
   eventCount 96
   firmware   1.10.16
   readonly   no
   READINGS:
     2025-03-19 10:21:17   0.ACTUAL_TEMPERATURE 25.0
     2025-03-19 10:21:17   0.ACTUAL_TEMPERATURE_STATUS NORMAL
     2025-03-19 10:35:07   0.CONFIG_PENDING false
     2025-03-19 10:35:07   0.DUTY_CYCLE    false
     2025-03-19 10:21:17   0.ERROR_CODE    0
     2025-03-19 10:21:17   0.ERROR_OVERHEAT false
     2025-03-19 10:21:17   0.ERROR_OVERLOAD false
     2025-03-19 10:35:07   0.RSSI_DEVICE   -74
     2025-03-19 10:34:44   0.RSSI_PEER     -87
     2025-03-19 10:35:07   0.UNREACH       alive
     2025-03-19 10:35:08   3.ACTIVITY_STATE STABLE
     2025-03-19 10:35:08   3.LEVEL         50
     2025-03-19 10:35:08   3.LEVEL_2       29
     2025-03-19 10:35:08   3.LEVEL_2_STATUS NORMAL
     2025-03-19 10:35:08   3.LEVEL_STATUS  NORMAL
     2025-03-19 10:35:08   3.PROCESS       STABLE
     2025-03-19 10:35:08   3.SECTION       
     2025-03-19 10:35:08   3.SECTION_STATUS UNKNOWN
     2025-03-01 17:46:04   3.SELF_CALIBRATION_RESULT true
     2025-03-19 10:35:08   4.ACTIVITY_STATE STABLE
     2025-03-19 10:35:08   4.LEVEL         50
     2025-03-19 10:35:08   4.LEVEL_2       29
     2025-03-19 10:35:08   4.LEVEL_2_STATUS NORMAL
     2025-03-19 10:35:08   4.LEVEL_STATUS  NORMAL
     2025-03-19 10:35:08   4.PROCESS       STABLE
     2025-03-19 10:35:08   4.SECTION       4
     2025-03-19 10:35:08   4.SECTION_STATUS NORMAL
     2025-03-18 12:04:04   IODev           CCU2
     2025-03-19 10:35:07   activity        alive
     2025-03-19 10:35:08   control         50
     2025-03-19 10:35:08   devstate        ok
     2025-03-19 10:35:08   hmstate         50
     2025-03-19 10:35:08   level           50
     2025-03-19 10:21:17   measured-temp   25.0
     2025-03-19 10:35:08   pct             50
     2025-03-19 10:35:08   pctSlats        29
     2025-03-19 10:35:07   rssidevice      -74
     2025-03-19 10:34:44   rssipeer        -87
     2025-03-19 10:35:08   state           50
   hmccu:
     channels   8
     defCDP     4.LEVEL
     defSDP     3.LEVEL
     detect     0
     devspec    0036E0C9AEC667
     forcedev   0
     nodefaults 1
     role       0:MAINTENANCE,1:KEY_TRANSCEIVER,2:KEY_TRANSCEIVER,3:BLIND_TRANSMITTER,4:BLIND_VIRTUAL_RECEIVER,5:BLIND_VIRTUAL_RECEIVER,6:BLIND_VIRTUAL_RECEIVER,7:BLIND_WEEK_PROFILE
     setDefaults 0
     cmdlist:
       get       
       set        pct oldLevel:noArg down stop:noArg up close:noArg allLevels openSlats:noArg closeSlats:noArg open:noArg toggle:noArg pctSlats
     control:
       chn        4
       dpt        LEVEL
     dp:
       0.ACTUAL_TEMPERATURE:
         VALUES:
           NVAL       25.0
           ONVAL      26.0
           OSVAL      26.0
           OVAL       26.0
           SVAL       25.0
           VAL        25.0
       0.ACTUAL_TEMPERATURE_STATUS:
         VALUES:
           NVAL       0
           SVAL       NORMAL
           VAL        0
       0.CONFIG_PENDING:
         VALUES:
           NVAL       0
           SVAL       false
           VAL        0
       0.DUTY_CYCLE:
         VALUES:
           NVAL       0
           SVAL       false
           VAL        0
       0.ERROR_CODE:
         VALUES:
           NVAL       0
           SVAL       0
           VAL        0
       0.ERROR_OVERHEAT:
         VALUES:
           NVAL       0
           SVAL       false
           VAL        0
       0.ERROR_OVERLOAD:
         VALUES:
           NVAL       0
           SVAL       false
           VAL        0
       0.RSSI_DEVICE:
         VALUES:
           NVAL       -74
           ONVAL      -81
           OSVAL      -81
           OVAL       -81
           SVAL       -74
           VAL        -74
       0.RSSI_PEER:
         VALUES:
           NVAL       -87
           ONVAL      -78
           OSVAL      -78
           OVAL       -78
           SVAL       -87
           VAL        -87
       0.UNREACH:
         VALUES:
           NVAL       0
           SVAL       alive
           VAL        0
       3.ACTIVITY_STATE:
         VALUES:
           NVAL       3
           ONVAL      2
           OSVAL      DOWN
           OVAL       2
           SVAL       STABLE
           VAL        3
       3.LEVEL:
         VALUES:
           NVAL       50
           ONVAL      98.5
           OSVAL      98.5
           OVAL       0.985
           SVAL       50
           VAL        0.5
       3.LEVEL_2:
         VALUES:
           NVAL       29
           ONVAL      54
           OSVAL      54
           OVAL       0.54
           SVAL       29
           VAL        0.29
       3.LEVEL_2_STATUS:
         VALUES:
           NVAL       0
           SVAL       NORMAL
           VAL        0
       3.LEVEL_STATUS:
         VALUES:
           NVAL       0
           SVAL       NORMAL
           VAL        0
       3.PROCESS:
         VALUES:
           NVAL       0
           ONVAL      1
           OSVAL      NOT_STABLE
           OVAL       1
           SVAL       STABLE
           VAL        0
       3.SECTION:
         VALUES:
           NVAL       
           SVAL       
           VAL       
       3.SECTION_STATUS:
         VALUES:
           NVAL       1
           SVAL       UNKNOWN
           VAL        1
       4.ACTIVITY_STATE:
         VALUES:
           NVAL       3
           ONVAL      2
           OSVAL      DOWN
           OVAL       2
           SVAL       STABLE
           VAL        3
       4.LEVEL:
         VALUES:
           NVAL       50
           ONVAL      100
           OSVAL      open
           OVAL       1.0
           SVAL       50
           VAL        0.5
       4.LEVEL_2:
         VALUES:
           NVAL       29
           ONVAL      100
           OSVAL      100
           OVAL       1.0
           SVAL       29
           VAL        0.29
       4.LEVEL_2_STATUS:
         VALUES:
           NVAL       0
           SVAL       NORMAL
           VAL        0
       4.LEVEL_STATUS:
         VALUES:
           NVAL       0
           SVAL       NORMAL
           VAL        0
       4.PROCESS:
         VALUES:
           NVAL       0
           ONVAL      1
           OSVAL      NOT_STABLE
           OVAL       1
           SVAL       STABLE
           VAL        0
       4.SECTION:
         VALUES:
           NVAL       4
           ONVAL      3
           OSVAL      3
           OVAL       3
           SVAL       4
           VAL        4
       4.SECTION_STATUS:
         VALUES:
           NVAL       0
           SVAL       NORMAL
           VAL        0
       5.ACTIVITY_STATE:
         VALUES:
           NVAL       3
           SVAL       STABLE
           VAL        3
       5.LEVEL:
         VALUES:
           NVAL       0
           SVAL       closed
           VAL        0.0
       5.LEVEL_2:
         VALUES:
           NVAL       0
           SVAL       0
           VAL        0.0
       5.LEVEL_2_STATUS:
         VALUES:
           NVAL       0
           SVAL       NORMAL
           VAL        0
       5.LEVEL_STATUS:
         VALUES:
           NVAL       0
           SVAL       NORMAL
           VAL        0
       5.PROCESS:
         VALUES:
           NVAL       0
           SVAL       STABLE
           VAL        0
       5.SECTION:
         VALUES:
           NVAL       0
           SVAL       0
           VAL        0
       5.SECTION_STATUS:
         VALUES:
           NVAL       0
           SVAL       NORMAL
           VAL        0
       6.ACTIVITY_STATE:
         VALUES:
           NVAL       3
           SVAL       STABLE
           VAL        3
       6.LEVEL:
         VALUES:
           NVAL       0
           SVAL       closed
           VAL        0.0
       6.LEVEL_2:
         VALUES:
           NVAL       0
           SVAL       0
           VAL        0.0
       6.LEVEL_2_STATUS:
         VALUES:
           NVAL       0
           SVAL       NORMAL
           VAL        0
       6.LEVEL_STATUS:
         VALUES:
           NVAL       0
           SVAL       NORMAL
           VAL        0
       6.PROCESS:
         VALUES:
           NVAL       0
           SVAL       STABLE
           VAL        0
       6.SECTION:
         VALUES:
           NVAL       0
           SVAL       0
           VAL        0
       6.SECTION_STATUS:
         VALUES:
           NVAL       0
           SVAL       NORMAL
           VAL        0
       7.WEEK_PROGRAM_CHANNEL_LOCKS:
         VALUES:
           NVAL       0
           SVAL       0
           VAL        0
     roleChannels:
       BLIND_TRANSMITTER 3
       BLIND_VIRTUAL_RECEIVER 4,5,6
       BLIND_WEEK_PROFILE 7
       KEY_TRANSCEIVER 1,2
       MAINTENANCE 0
     roleCmds:
       get:
       set:
         allLevels:
           channel    4
           ps         VALUES
           role       BLIND_VIRTUAL_RECEIVER
           rpc        0
           subcount   2
           syntax     V:LEVEL_2:?slatLevel V:LEVEL:?blindLevel
           usage      allLevels slatLevel blindLevel
           subcmd:
             000:
               args       
               dpt        LEVEL_2
               fnc       
               max        1.01
               min        0.0
               parname    slatLevel
               partype    2
               ps         VALUES
               scn        000
               type       FLOAT
               unit       100%
             001:
               args       
               dpt        LEVEL
               fnc       
               max        1.01
               min        0.0
               parname    blindLevel
               partype    2
               ps         VALUES
               scn        001
               type       FLOAT
               unit       100%
         close:
           channel    4
           ps         VALUES
           role       BLIND_VIRTUAL_RECEIVER
           rpc        0
           subcount   1
           syntax     V:LEVEL:0
           usage      close
           subcmd:
             000:
               args       0
               dpt        LEVEL
               fnc       
               max        1.01
               min        0.0
               parname    LEVEL
               partype    3
               ps         VALUES
               scn        000
               type       FLOAT
               unit       100%
         closeSlats:
           channel    4
           ps         VALUES
           role       BLIND_VIRTUAL_RECEIVER
           rpc        0
           subcount   2
           syntax     V:LEVEL_2:0 V:LEVEL:1.005
           usage      closeSlats
           subcmd:
             000:
               args       0
               dpt        LEVEL_2
               fnc       
               max        1.01
               min        0.0
               parname    LEVEL_2
               partype    3
               ps         VALUES
               scn        000
               type       FLOAT
               unit       100%
             001:
               args       1.005
               dpt        LEVEL
               fnc       
               max        1.01
               min        0.0
               parname    LEVEL
               partype    3
               ps         VALUES
               scn        001
               type       FLOAT
               unit       100%
         down:
           channel    4
           ps         VALUES
           role       BLIND_VIRTUAL_RECEIVER
           rpc        0
           subcount   1
           syntax     V:LEVEL:?delta=-20
           usage      down [delta]
           subcmd:
             000:
               args       -20
               dpt        LEVEL
               fnc       
               max        1.01
               min        0.0
               parname    delta
               partype    2
               ps         VALUES
               scn        000
               type       FLOAT
               unit       100%
         oldLevel:
           channel    4
           ps         VALUES
           role       BLIND_VIRTUAL_RECEIVER
           rpc        0
           subcount   1
           syntax     V:LEVEL:1.005
           usage      oldLevel
           subcmd:
             000:
               args       1.005
               dpt        LEVEL
               fnc       
               max        1.01
               min        0.0
               parname    LEVEL
               partype    3
               ps         VALUES
               scn        000
               type       FLOAT
               unit       100%
         open:
           channel    4
           ps         VALUES
           role       BLIND_VIRTUAL_RECEIVER
           rpc        0
           subcount   1
           syntax     V:LEVEL:100
           usage      open
           subcmd:
             000:
               args       100
               dpt        LEVEL
               fnc       
               max        1.01
               min        0.0
               parname    LEVEL
               partype    3
               ps         VALUES
               scn        000
               type       FLOAT
               unit       100%
         openSlats:
           channel    4
           ps         VALUES
           role       BLIND_VIRTUAL_RECEIVER
           rpc        0
           subcount   2
           syntax     V:LEVEL_2:100 V:LEVEL:1.005
           usage      openSlats
           subcmd:
             000:
               args       100
               dpt        LEVEL_2
               fnc       
               max        1.01
               min        0.0
               parname    LEVEL_2
               partype    3
               ps         VALUES
               scn        000
               type       FLOAT
               unit       100%
             001:
               args       1.005
               dpt        LEVEL
               fnc       
               max        1.01
               min        0.0
               parname    LEVEL
               partype    3
               ps         VALUES
               scn        001
               type       FLOAT
               unit       100%
         pct:
           channel    4
           ps         VALUES
           role       BLIND_VIRTUAL_RECEIVER
           rpc        0
           subcount   1
           syntax     V:LEVEL:?level
           usage      pct level
           subcmd:
             000:
               args       
               dpt        LEVEL
               fnc       
               max        1.01
               min        0.0
               parname    level
               partype    2
               ps         VALUES
               scn        000
               type       FLOAT
               unit       100%
         pctSlats:
           channel    4
           ps         VALUES
           role       BLIND_VIRTUAL_RECEIVER
           rpc        0
           subcount   2
           syntax     V:LEVEL_2:?level V:LEVEL:1.005
           usage      pctSlats level
           subcmd:
             000:
               args       
               dpt        LEVEL_2
               fnc       
               max        1.01
               min        0.0
               parname    level
               partype    2
               ps         VALUES
               scn        000
               type       FLOAT
               unit       100%
             001:
               args       1.005
               dpt        LEVEL
               fnc       
               max        1.01
               min        0.0
               parname    LEVEL
               partype    3
               ps         VALUES
               scn        001
               type       FLOAT
               unit       100%
         stop:
           channel    4
           ps         VALUES
           role       BLIND_VIRTUAL_RECEIVER
           rpc        0
           subcount   1
           syntax     V:STOP:1
           usage      stop
           subcmd:
             000:
               args       1
               dpt        STOP
               fnc       
               max        1
               min        0
               parname    STOP
               partype    3
               ps         VALUES
               scn        000
               type       ACTION
               unit       
         toggle:
           channel    4
           ps         VALUES
           role       BLIND_VIRTUAL_RECEIVER
           rpc        0
           subcount   1
           syntax     V:LEVEL:0,100
           usage      toggle
           subcmd:
             000:
               args       0,100
               dpt        LEVEL
               fnc       
               max        1.01
               min        0.0
               parname    LEVEL
               partype    3
               ps         VALUES
               scn        000
               type       FLOAT
               unit       100%
         up:
           channel    4
           ps         VALUES
           role       BLIND_VIRTUAL_RECEIVER
           rpc        0
           subcount   1
           syntax     V:LEVEL:?delta=+20
           usage      up [delta]
           subcmd:
             000:
               args       +20
               dpt        LEVEL
               fnc       
               max        1.01
               min        0.0
               parname    delta
               partype    2
               ps         VALUES
               scn        000
               type       FLOAT
               unit       100%
     state:
       chn        3
       dpt        LEVEL
Attributes:
   DbLogExclude .*
   Devicename OG Sportzimmer - Raffstore Aktor
   alias      OG_RA01_Sportzimmer
   ccuflags   showDeviceReadings
   ccureadingfilter 0,1,2,3,4..*
   cmdIcon    open:fts_shutter_up stop:fts_shutter_manual close:fts_shutter_down
   comment    Set Befehle:
set OG_RA01_BueroReinhard_3 allLevels slatLevel blindLevel - Beispiel set OG_RA01_BueroReinhard_3 allLevels 100 100 ## Raffstore fährt komplett nach oben
   event-on-change-reading .*
   group      Beschattung,HmIP-Device
   icon       fts_shutter_50
   room       OG_Sportzimmer
   substexcl  pct
   userattr   Devicename
   webCmd     pct:open:close:stop
   widgetOverride pct:slider,0,10,100

Im Anhang noch ein list vom Test doif, in welchen der Vergleich als ungleich erkannt wird, obwohl anscheinend beide Zahlen gleich sind, die Ergebnisse des Vergleichs sind in den Readings Ergebnis_x enthalten:
Internals:
   CFGFN     
   DEF        {
my $Iw_Lamellen = [OG_RA01_BueroReinhard_3:pctSlats];
my $Sw_Lamellen = 29;
##
#################################################################################
######################### Vergleich Raffstore Lamellen ##########################
#################################################################################
##
if ($Iw_Lamellen != $Sw_Lamellen and [OG_RA01_BueroReinhard_3:4.PROCESS] eq "STABLE") {
set_Reading("Ergebnis_1","Istwert Lamellen: $Iw_Lamellen ungleich Sollwert Lamellen: $Sw_Lamellen",0);
if ($Iw_Lamellen < $Sw_Lamellen) {
set_Reading("Ergebnis_2","Istwert Lamellen: $Iw_Lamellen kleiner Sollwert Lamellen: $Sw_Lamellen",0);
if ($Iw_Lamellen < 28.99999999999) {
set_Reading("Ergebnis_3","Istwert Lamellen: $Iw_Lamellen kleiner Sollwert Lamellen: 28.99999999999",0);
}
if ($Iw_Lamellen > 28.99999999999) {
set_Reading("Ergebnis_3","Istwert Lamellen: $Iw_Lamellen größer Sollwert Lamellen: 28.99999999999",0);
}
} else {
set_Reading("Ergebnis_2","Istwert Lamellen: $Iw_Lamellen größer Sollwert Lamellen: $Sw_Lamellen",0)
}
} else {
set_Reading("Ergebnis_1","Istwert Lamellen: $Iw_Lamellen gleich Sollwert Lamellen: $Sw_Lamellen",0)
}
}
   FUUID      67da8588-f33f-7df9-3ee7-e07e01bedb58c34a
   MODEL      Perl
   NAME       di_Test
   NOTIFYDEV  OG_RA01_BueroReinhard_3,global
   NR         632
   NTFY_ORDER 50-di_Test
   STATE      initialized
   TYPE       DOIF
   VERSION    29460 2024-12-29 20:25:48
   eventCount 19
   Helper:
     DBLOG:
       mode:
         DBLogging:
           TIME       1742374280.39628
           VALUE      enabled
   OLDREADINGS:
   READINGS:
     2025-03-19 10:47:43   Ergebnis_1      Istwert Lamellen: 29 ungleich Sollwert Lamellen: 29
     2025-03-19 10:47:43   Ergebnis_2      Istwert Lamellen: 29 kleiner Sollwert Lamellen: 29
     2025-03-19 10:47:43   Ergebnis_3      Istwert Lamellen: 29 größer Sollwert Lamellen: 28.99999999999
     2025-03-19 10:47:43   block_01        executed
     2025-03-19 10:47:10   mode            enabled
     2025-03-19 10:47:10   state           initialized
   Regex:
     accu:
     bar:
     barAvg:
     collect:
     cond:
       OG_RA01_BueroReinhard_3:
         0:
           4.PROCESS  ^OG_RA01_BueroReinhard_3$:^4.PROCESS:
           pctSlats   ^OG_RA01_BueroReinhard_3$:^pctSlats:
   condition:
     0         
my $Iw_Lamellen = ::ReadingValDoIf($hash,'OG_RA01_BueroReinhard_3','pctSlats');
my $Sw_Lamellen = 29;
     if ($Iw_Lamellen != $Sw_Lamellen and ::ReadingValDoIf($hash,'OG_RA01_BueroReinhard_3','4.PROCESS') eq "STABLE") {
set_Reading("Ergebnis_1","Istwert Lamellen: $Iw_Lamellen ungleich Sollwert Lamellen: $Sw_Lamellen",0);
if ($Iw_Lamellen < $Sw_Lamellen) {
set_Reading("Ergebnis_2","Istwert Lamellen: $Iw_Lamellen kleiner Sollwert Lamellen: $Sw_Lamellen",0);
if ($Iw_Lamellen < 28.99999999999) {
set_Reading("Ergebnis_3","Istwert Lamellen: $Iw_Lamellen kleiner Sollwert Lamellen: 28.99999999999",0);
}
if ($Iw_Lamellen > 28.99999999999) {
set_Reading("Ergebnis_3","Istwert Lamellen: $Iw_Lamellen größer Sollwert Lamellen: 28.99999999999",0);
}
} else {
set_Reading("Ergebnis_2","Istwert Lamellen: $Iw_Lamellen größer Sollwert Lamellen: $Sw_Lamellen",0)
}
} else {
set_Reading("Ergebnis_1","Istwert Lamellen: $Iw_Lamellen gleich Sollwert Lamellen: $Sw_Lamellen",0)
}

   helper:
     NOTIFYDEV  OG_RA01_BueroReinhard_3,global
     globalinit 1
     last_timer 0
     sleeptimer -1
   hmccu:
   perlblock:
     0          block_01
   readings:
     all         OG_RA01_BueroReinhard_3:pctSlats OG_RA01_BueroReinhard_3:4.PROCESS
   uiState:
   uiTable:
Attributes:
   DbLogExclude .*
   DbLogInclude Meldung_Behang,Meldung_Lamellen

Ich gebe aktuell als Vergleichswert nicht eine einzelne Zahl, sondern einen Bereich vor, damit ich überhaupt ein Ergebnis bekomme. Das funktioniert grundsätzlich, ich möchte es aber gerne verstehen, deshalb der Beitrag.
Ich hoffe irgend jemand von euch kann mir dieses Verhalten erklären.

Gruß Reinhard
Fhem 6.3 auf Raspberry Pi4 SSD mit Raspbian Bookworm, Homematic, Homematic IP, CCU3 mit RapberryMatic, WAGO 750-880, E3DC S10E Hauskraftwerk, E3DC Wallbox, my-PV AC ELWA-E Heizstab, Fritz!Box 7590, KIA Bluelinky

betateilchen

Zitat von: Rewe2000 am 19 März 2025, 11:23:31Gibt es eine Möglichkeit die Zahlen irgendwo im Rohwert darzustellen

Bau doch mal Debug-Ausgaben direkt in Deinen perl code ein (ich hoffe, das geht an der Stelle überhaupt)

my $Iw_Lamellen = [OG_RA01_BueroReinhard_3:pctSlats];
my $Sw_Lamellen = 29;
Debug "Ist:$Iw_Lamellen Soll:$Sw_Lamellen";

Hast Du mal versucht, alphanumerisch zu vergleichen anstatt numerisch?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Rewe2000

#2
Hallo betateilchen,

danke für die schnelle Antwort.

Ein alphanumerischer Vergleich wird korrekt verarbeitet, wenn ich die Zahlen mit der Perl Funktion qq() umwandle.
Siehe anhängendes Test-doif (Ergebnisse unter Readings):
Internals:
   CFGFN     
   DEF        {
my $Iw_Lamellen = [OG_RA01_BueroReinhard_3:pctSlats];
my $Sw_Lamellen = 29; ## [di_Beschattung_Sportzimmer_Terrassentuere:M_pctSlats];
my $Iw_Lamellen_String = qq($Iw_Lamellen);
my $Sw_Lamellen_String = qq($Sw_Lamellen);
##
#################################################################################
######################### Vergleich Raffstore Lamellen ##########################
#################################################################################
##
if ($Iw_Lamellen_String ne $Sw_Lamellen_String and [OG_RA01_BueroReinhard_3:4.PROCESS] eq "STABLE") {
    set_Reading("Ergebnis_Vergleich_String","Istwert Lamellen: $Iw_Lamellen_String ungleich Sollwert Lamellen: $Sw_Lamellen_String",0)
} else {
    set_Reading("Ergebnis_Vergleich_String","Istwert Lamellen: $Iw_Lamellen_String gleich Sollwert Lamellen: $Sw_Lamellen_String",0)
}   
if ($Iw_Lamellen != $Sw_Lamellen and [OG_RA01_BueroReinhard_3:4.PROCESS] eq "STABLE") {
    set_Reading("Ergebnis_Vergleich_Numerisch","Istwert Lamellen: $Iw_Lamellen ungleich Sollwert Lamellen: $Sw_Lamellen",0);
} else {
    set_Reading("Ergebnis_Vergleich_Numerisch","Istwert Lamellen: $Iw_Lamellen gleich Sollwert Lamellen: $Sw_Lamellen",0)
}
}
   FUUID      67da8588-f33f-7df9-3ee7-e07e01bedb58c34a
   MODEL      Perl
   NAME       di_Test
   NOTIFYDEV  global,OG_RA01_BueroReinhard_3
   NR         632
   NTFY_ORDER 50-di_Test
   STATE      initialized
   TYPE       DOIF
   VERSION    29460 2024-12-29 20:25:48
   eventCount 47
   Helper:
     DBLOG:
       mode:
         DBLogging:
           TIME       1742374280.39628
           VALUE      enabled
   OLDREADINGS:
   READINGS:
     2025-03-19 14:09:11   Ergebnis_Vergleich_Numerisch Istwert Lamellen: 29 ungleich Sollwert Lamellen: 29
     2025-03-19 14:09:11   Ergebnis_Vergleich_String Istwert Lamellen: 29 gleich Sollwert Lamellen: 29
     2025-03-19 14:09:11   block_01        executed
     2025-03-19 14:09:08   mode            enabled
     2025-03-19 14:09:08   state           initialized
   Regex:
     accu:
     bar:
     barAvg:
     collect:
     cond:
       OG_RA01_BueroReinhard_3:
         0:
           4.PROCESS  ^OG_RA01_BueroReinhard_3$:^4.PROCESS:
           pctSlats   ^OG_RA01_BueroReinhard_3$:^pctSlats:
   condition:
     0         
my $Iw_Lamellen = ::ReadingValDoIf($hash,'OG_RA01_BueroReinhard_3','pctSlats');
my $Sw_Lamellen = 29;  my $Iw_Lamellen_String = qq($Iw_Lamellen);
my $Sw_Lamellen_String = qq($Sw_Lamellen);
     if ($Iw_Lamellen_String ne $Sw_Lamellen_String and ::ReadingValDoIf($hash,'OG_RA01_BueroReinhard_3','4.PROCESS') eq "STABLE") {
    set_Reading("Ergebnis_Vergleich_String","Istwert Lamellen: $Iw_Lamellen_String ungleich Sollwert Lamellen: $Sw_Lamellen_String",0)
} else {
    set_Reading("Ergebnis_Vergleich_String","Istwert Lamellen: $Iw_Lamellen_String gleich Sollwert Lamellen: $Sw_Lamellen_String",0)
}   
if ($Iw_Lamellen != $Sw_Lamellen and ::ReadingValDoIf($hash,'OG_RA01_BueroReinhard_3','4.PROCESS') eq "STABLE") {
    set_Reading("Ergebnis_Vergleich_Numerisch","Istwert Lamellen: $Iw_Lamellen ungleich Sollwert Lamellen: $Sw_Lamellen",0);
} else {
    set_Reading("Ergebnis_Vergleich_Numerisch","Istwert Lamellen: $Iw_Lamellen gleich Sollwert Lamellen: $Sw_Lamellen",0)
}

   helper:
     NOTIFYDEV  global,OG_RA01_BueroReinhard_3
     globalinit 1
     last_timer 0
     sleeptimer -1
   hmccu:
   perlblock:
     0          block_01
   readings:
     all         OG_RA01_BueroReinhard_3:pctSlats OG_RA01_BueroReinhard_3:4.PROCESS
   uiState:
   uiTable:
Attributes:
   DbLogExclude .*

Mit deinem Debug Vorschlag bin ich leider nicht weiter gekommen, direkt im doif wird die Debug Zeile nicht akzeptiert, ich habe auch zum Debug selbst keinerlei brauchbaren Infos gefunden, wenn du mir hier noch ein wenig weiterhelfen könntest.
Sollten denn die Debug Angaben in 99_myUtils.pm funktionieren, wenn ja, so könnte ich diese testweise über eine Funktion dahin verlegen.
Oder stehe ich da total neben der Spur.

Kurios ist auch folgendes, den fehlerhaften Vergleich habe ich bisher nur bei der Lamellenstellung von 29 (%) beobachtet, nie bei anderen Werten, deshalb würde mich der Rohwert interessieren, so wie er aus dem Rollodevice kommt. Zuerst dachte ich an einen "unsichtbaren" Nachkommawert, aber auch dies konnte ich noch nie über einen if-Vergleich darstellen.

Gruß Reinhard
Fhem 6.3 auf Raspberry Pi4 SSD mit Raspbian Bookworm, Homematic, Homematic IP, CCU3 mit RapberryMatic, WAGO 750-880, E3DC S10E Hauskraftwerk, E3DC Wallbox, my-PV AC ELWA-E Heizstab, Fritz!Box 7590, KIA Bluelinky