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ß!
Hast Du auch ein update von FHEM gemacht nachdem Du es installiert hast?
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
Denke nicht das es hilft aber klammer mal
my $jsonPayload = encode_json(\%huePayload);
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!
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
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.
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?
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.
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 :)