FritzSmart ab Modul-Version 26.05.07

Begonnen von JoWiemann, 07 Mai 2026, 19:21:30

Vorheriges Thema - Nächstes Thema

JoWiemann

Zitat von: Sidey am 09 Juni 2026, 07:57:25Alternativ ein anderes robusteres XML Package.
Ich habe  Hinweise gefunden, dass die Nutzung von XML::Simple vermieden werden sollte.
Grüße Sidey

Hallo Sidey,

ich habe jetzt mal zusätzlich XML::Hash::XS eingebaut. Sofern vorhanden kann er über das neue Attribut xmlParser ausgewählt werden. Ist nur einer von beiden (XML::Hash::XS, XML::Simple) installiert, dann existiert das Attribut nicht und der Installierte wird zum Default.

Anbei eine Beta zum Testen, wenn Du möchtest.

Danke und Grüße

Jörg

Jörg Wiemann

RPi 4 B mit 4 GByte bookworm, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM; zigbee2mqtt

ioBroker als Datenlieferant für z.B. Anker, Samsung

JoWiemann

#31
Hallo,

ich habe jetzt mal eine Meta.json im Modul angefügt. Vielleicht kann ja mal jemand prüfen, ob ich das soweit richtig verstanden habe. Danke Euch.

Grüße Jörg
Jörg Wiemann

RPi 4 B mit 4 GByte bookworm, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM; zigbee2mqtt

ioBroker als Datenlieferant für z.B. Anker, Samsung

elektron-bbs

Zu den Meta-Daten kann ich nichts sagen, aber mir ist etwas anderes aufgefallen:

Der Befehl "set Fritzbox call xxx" funktioniert prinzipiell jetzt, erzeugt aber folgende Warnungen im Log:
2026.06.23 14:49:17 3: [FritzBox_7590|FRITZ!Box 7590|154.08.25|Set_Modul.2607] - BASIC:set FritzBox_7590 call - 1234567
2026.06.23 14:49:17 1: PERL WARNING: Argument "" isn't numeric in numeric ge (>=) at ./FHEM/72_FritzSmart.pm line 3297.
2026.06.23 14:49:17 1: PERL WARNING: Use of uninitialized value $val[2] in join or string at ./FHEM/72_FritzSmart.pm line 3315.
2026.06.23 14:49:18 3: [FritzBox_7590|FRITZ!Box 7590|154.08.25|Set_call_Phone.13097] - BASIC:Call 1234567 for 60 seconds - 49443

In der deutschen commandref ist in Zeile 21386 "etwas verloren gegangen:
      <li><a name="wlanNeighborsPrefix"></a>
         <dt><code>attr &lt;name&gt; wlanNeighborsPrefix &lt;prefix&gt;</code></dt>
         <br>
         Sofern beide Parser ().
      </li><br>
Da stand vorher:
      <li><a name="wlanNeighborsPrefix"></a>
         <dt><code>attr &lt;name&gt; wlanNeighborsPrefix &lt;prefix&gt;</code></dt>
         <br>
         Definiert einen Präfix für den Reading Namen der WLAN Nachbarschaftsgeräte, der aus der MAC Adresse gebildet wird. Der default Präfix ist nbh_.
      </li><br>
Intel(R) Atom(TM) CPU N270 mit 2 SIGNALduino nanoCC1101 + ESPEasy 2x serial server SIGNALduino nanoCC1101, Raspberry Pi 2 mit 2 CUL Stackable CC1101, Raspberry Pi 3 mit SIGNALduino radino + nano328 + 2 x SIGNAL-ESP CC1101 + 1 x rf_Gateway + 1 x SIGNAL-STM

Didi

Super jetzt funktioniert es wieder.
Herzlichen Dank für die schnelle Hilfe.
Gruß
Dieter

JoWiemann

Hallo elektron-bbs,

vielen Dank für die Rückmeldung. Anbei eine neue Version zum Testen. Über einen Test bzgl. XML Parser würde ich mich auch noch freuen.

Grüße Jörg
Jörg Wiemann

RPi 4 B mit 4 GByte bookworm, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM; zigbee2mqtt

ioBroker als Datenlieferant für z.B. Anker, Samsung

Sidey

#35
Zitat von: JoWiemann am 22 Juni 2026, 20:41:54ich habe jetzt mal eine Meta.json im Modul angefügt. Vielleicht kann ja mal jemand prüfen, ob ich das soweit richtig verstanden habe. Danke Euch.


Hallo Jörg,

Prima.

ich habe den =for :application/json;q=META.json-Block in 72_FritzSmart.pm geprüft.

  Kurzfazit:

  - Der JSON-Block ist syntaktisch korrekt und lässt sich ohne Fehler parsen.
  - Das =for/=end-Paar ist ebenfalls sauber geschlossen.

Zur inhaltlichen Einordnung:

  - XML::Hash::XS in suggests passt aus meiner Sicht. Im Code werden XML::Simple und XML::Hash::XS als alternative Parser behandelt, und das Modul kann auch mit nur einem von beiden starten.
  - In recommends stehen aber einige Einträge, die im aktuellen Code eher wie Pflichtabhängigkeiten wirken oder zumindest veraltet sind.
  - FHEM::Meta wird direkt per use geladen und auch direkt verwendet, daher wäre das eher ein Kandidat für requires als für recommends.
  - DateTime, DateTime::Format::Strptime und FHEM::Utility::CTZ habe ich im Code nicht als echte Nutzung gefunden. Die wirken eher wie Altlasten im META-Block.
  - Die Module MIME::Base64, JSON, LWP::UserAgent, URI::Escape, XML::Simple und Data::Dumper werden im Code direkt genutzt.

Mein Eindruck ist daher:

  - Syntax: okay
  - Inhaltliche Klassifizierung: teilweise überarbeitungsbedürftig


Nebenbei habe ich noch eine weitere Sache aufgefallen, die ich mit dir teilen möchte:

1)
In "Fritz_Attr_Modul"  gibt es viele if Bedingungen die auf aName prüfen. Bei machen wird mit return die sub beendet.
Immer dann, wenn es kein return gibt müssen alle if Bedingungen geprüft werde, auch wenn schon einer zutreffend war und soweit ich das überblicke, kann immer nur eine der Bedingungen zutreffen.

Effizienter ist es mit if und elsif zu arbeiten. Sobald eine Bedingung zutrifft, wird die gesamte Prüfung weiterer Bedingungen beendet. Bei der aktuellen Implementierung ist das nicht der Fall.


---

Das FritzSmart.pm funktioniert nicht, wenn XML::Hash::XS nicht installiert ist.
Damit das entweder/oder wie geplant funktioniert ist eine Anpassung notwendig:

 
  diff --git a/72_FritzSmart.pm b/72_FritzSmart.pm
  --- a/72_FritzSmart.pm
  +++ b/72_FritzSmart.pm
  @@ -1571,16 +1571,16 @@ sub Fritz_Define_Modul($$)
  -   $hash->{helper}{XML_Simple}  = 1;
  -   $hash->{helper}{XML_Hash_XS} = 1;
  -
  -   # Check if perl modules for remote APIs exists
  -   if ($missingModul =~ /XML::Simple/ && $missingModul =~ /XML::Hash::XS/) {
  -     $hash->{helper}{XML_Simple}  = 0;
  -     $hash->{helper}{XML_Hash_XS} = 0;
  -   } elsif ($missingModul =~ /XML::Simple/ && $missingModul !~ /XML::Hash::XS/) {
  -     $missingModul =~ s/XML::Simple //;
  -     $hash->{helper}{XML_Simple} = 0;
  -   } elsif ($missingModul !~ /XML::Simple/ && $missingModul =~ /XML::Hash::XS/) {
  -     $missingModul =~ s/XML::Hash::XS //;
  -     $hash->{helper}{XML_Hash_XS} = 0;
  +   $hash->{helper}{XML_Simple}  = ($missingModul !~ /XML::Simple/);
  +   $hash->{helper}{XML_Hash_XS} = ($missingModul !~ /XML::Hash::XS/);
  +
  +   # XML::Simple and XML::Hash::XS are optional, but at least one parser must be available.
  +   # Remove missing parser modules from the fatal dependency list; keep all other missing
  +   # modules fatal so the module still fails fast on real runtime dependencies.
  +   $missingModul =~ s/XML::Simple //g;
  +   $missingModul =~ s/XML::Hash::XS //g;
  +
  +   if (!$hash->{helper}{XML_Simple} && !$hash->{helper}{XML_Hash_XS}) {
  +     $missingModul .= "XML::Simple XML::Hash::XS ";
      }

Grüße Sidey



Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem,zigbee2mqtt

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker, WebAuth, fhem-mcp