Nach FHEM + Perl Update Fehler bei Verwendung von "encode_json" in 99_myUtils

Begonnen von r00t2, 28 März 2020, 16:06:11

Vorheriges Thema - Nächstes Thema

r00t2

Hallo zusammen,

notgedrungen (SD Karte defekt) habe ich meinen Raspberry Pi 2 neu aufgesetzt.

Jetzt läuft: Raspbian Buster minimal mit FHEM 6.0 und Perl Version 5.28.1

Die alte Konfiguration habe ich fast ohne Probleme aus einem aktuellen Backup übernehmen können.

Aber: Zur Steuerung einer HUE Lampe habe ich mir ein kleines Sub in der myUtils geschrieben, welches auf der alten FHEM Version (5.9) einwandfrei lief:
#### HUESetBrightness - Begin ####
#
sub HUESetBrightness($$$) {
  my ($lightID, $brightnessValue, $transitionTime) = @_; # Light, brightness and transition time to be used
  my $hueURL = "http://xxx.xxx.xxx.xxx/api/ID/lights/$lightID/state";
 
  my %huePayload = ('bri' => int($brightnessValue), 'transitiontime' => int($transitionTime));
  my $jsonPayload = encode_json \%huePayload ;

  Log 1, "HUESetScene setting light [$lightID] to brightness [$brightnessValue] with transitiontime [$transitionTime] - URL [$hueURL] - Payload [$jsonPayload]";

  # Create a user agent object
  my $userAgent = LWP::UserAgent->new;
  $userAgent->agent("FHEM/0.1");

  # Create a Hue request
  my $hueRequest = HTTP::Request->new(PUT => $hueURL);
  $hueRequest->content_type('application/json');
  $hueRequest->content($jsonPayload);

  # Pass requests to the user agent and get a response back
  my $hueResponse = $userAgent->request($hueRequest);
  my $hash = decode_json $hueResponse->content;
  my $niceHash = Dumper $hash;
  $niceHash =~ s/\s+//g; # Remove all whitespaces and linefeeds

  Log 1, "HUESetScene request result was: [$niceHash]";
}
#### HUESetBrightness - End ####



Wie man sieht verpacke ich dort einige Elemente in JSON mit den Zeilen:
my %huePayload = ('bri' => int($brightnessValue), 'transitiontime' => int($transitionTime));
my $jsonPayload = encode_json \%huePayload ;



Nun bekomme ich dafür beim FHEM Start Fehlermeldungen ins Log geworfen, dass das JSON Encoding nicht mehr funktioniert:
2020.03.28 15:34:26 1: PERL WARNING: Backslash found where operator expected at ./FHEM/99_myUtils.pm line 207, near "encode_json \"
2020.03.28 15:34:26 1: PERL WARNING: (Do you need to predeclare encode_json?)
2020.03.28 15:34:26 1: reload: Error:Modul 99_myUtils deactivated:
syntax error at ./FHEM/99_myUtils.pm line 207, near "encode_json \"
Global symbol "$jsonPayload" requires explicit package name (did you forget to declare "my $jsonPayload"?) at ./FHEM/99_myUtils.pm line 209.


Woran kann das liegen und hat sich ggf. in der Syntax etwas geändert von dem ich nichts weiß?

Danke für ein paar erhellende Rückmeldungen.

Gruß!
FHEM 6.0 (Raspberry Pi 2 B | Raspberry Pi OS Lite | Perl 5.28.1 | UZB Z-WAVE.Me | Hue Bridge V1 | SIGNALDuino 433 MHz | FritzBox | Kodi | Pioneer AVR | MQTT | Node-RED | Diverse Google Dienste)

CoolTux

Hast Du auch ein update von FHEM gemacht nachdem Du es installiert hast?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

r00t2

Ja, "normales" Update und - weil er mir den FritzBox CallMonitor nicht mehr einbinden wollte - auch ein update force hinterher.
Danach jedes Mal shutdown restart.

Also sprich:
FHEM 6.0 installiert
FHEM 5.9 Backup rückgesichert
update + shutdown restart
Gemerkt, dass FB CM nicht mehr geladen wird
update force + shutdown restart
FHEM 6.0 (Raspberry Pi 2 B | Raspberry Pi OS Lite | Perl 5.28.1 | UZB Z-WAVE.Me | Hue Bridge V1 | SIGNALDuino 433 MHz | FritzBox | Kodi | Pioneer AVR | MQTT | Node-RED | Diverse Google Dienste)

CoolTux

Denke nicht das es hilft aber klammer mal

my $jsonPayload = encode_json(\%huePayload);
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

r00t2

Das schaut besser aus!
Nach einen shutdown restart sehe ich nun keine Fehlermeldungen diesbezüglich mehr.

Mal sehen, ob es später auch klappt mit der Ausführung. Ich melde mich.

Danke schon mal!
FHEM 6.0 (Raspberry Pi 2 B | Raspberry Pi OS Lite | Perl 5.28.1 | UZB Z-WAVE.Me | Hue Bridge V1 | SIGNALDuino 433 MHz | FritzBox | Kodi | Pioneer AVR | MQTT | Node-RED | Diverse Google Dienste)

CoolTux

Lass mich kurz ein Wort zu Deiner Routine verlieren.
my $hueRequest = HTTP::Request->new(PUT => $hueURL);
Kann dafür sorgen das FHEM für einige Sekunden steht wenn zum Beispiel die Gegenstelle offline ist oder die API klemmt. Besser wäre es hier FHEM interne Routinen zu verwenden.
HttpUtils_NonblockingGet aus den HttpUtils wäre da besser.
https://wiki.fhem.de/wiki/HttpUtils
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

r00t2

Kurze Rückmeldung, wie besprochen.

Das Absetzen des Befehls funktioniert einwandfrei.
Das Rücklesen der Response auch - nachdem ich das Dekodieren des JSON Strings auch in Klammern gesetzt habe.
Aus:
my $hash = decode_json $hueResponse->content;
Wurde:
my $hash = decode_json($hueResponse->content);

Bezüglich Deines Tipps mit dem nicht blockierenden Aufrufs: Danke dafür! Da muss ich mich wohl ganz ehrlich erst mal etwas einfuchsen  :-[ Vor allem mit den Callback Funktionen für die Response, etc.
FHEM 6.0 (Raspberry Pi 2 B | Raspberry Pi OS Lite | Perl 5.28.1 | UZB Z-WAVE.Me | Hue Bridge V1 | SIGNALDuino 433 MHz | FritzBox | Kodi | Pioneer AVR | MQTT | Node-RED | Diverse Google Dienste)

r00t2

Nochmals kurzer Nachtrag:
Auch die Zeile mit dem Dumper Befehl musste wohl noch überarbeitet werden.

Aus:
my $niceHash = Dumper $hash;

Habe ich folgendes gemacht:
my $niceHash = Dumper($hash);

Test dann heute Abend möglich.

Nun frage ich mich aber doch, weshalb man die Aufrufe jetzt anders schreiben mus? Gab es da eine Syntaxänderung in Perl oder war die vorherige Schreibweise einfach unsauber?
FHEM 6.0 (Raspberry Pi 2 B | Raspberry Pi OS Lite | Perl 5.28.1 | UZB Z-WAVE.Me | Hue Bridge V1 | SIGNALDuino 433 MHz | FritzBox | Kodi | Pioneer AVR | MQTT | Node-RED | Diverse Google Dienste)

CoolTux

Zitat von: r00t2 am 30 März 2020, 09:12:09
Nochmals kurzer Nachtrag:
Auch die Zeile mit dem Dumper Befehl musste wohl noch überarbeitet werden.

Aus:
my $niceHash = Dumper $hash;

Habe ich folgendes gemacht:
my $niceHash = Dumper($hash);

Test dann heute Abend möglich.

Nun frage ich mich aber doch, weshalb man die Aufrufe jetzt anders schreiben mus? Gab es da eine Syntaxänderung in Perl oder war die vorherige Schreibweise einfach unsauber?

Unsauber. Perl hatte das in alten Versionen nicht angemeckert, in neueren wurde es wohl gleich ganz verboten.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

r00t2

Danke Dir.
Dann arbeite ich ab jetzt sauberer. Kommt mir eh gelegen Parameter der Funktionsaufrufe zu klammern, da ich aus der C/C++/C# Ecke komme :)
FHEM 6.0 (Raspberry Pi 2 B | Raspberry Pi OS Lite | Perl 5.28.1 | UZB Z-WAVE.Me | Hue Bridge V1 | SIGNALDuino 433 MHz | FritzBox | Kodi | Pioneer AVR | MQTT | Node-RED | Diverse Google Dienste)