[Gelöst] JSON blessed Boolean - TelegramBot

Begonnen von Blechzwerg, 16 Dezember 2017, 22:30:00

Vorheriges Thema - Nächstes Thema

Blechzwerg

mOin,

mein TelegramBot verweigert jedwede Tricks, die mit Telegram Keyboards zu tun haben könnten.
Eine gewöhnliche Nachricht mit ohne Extras sind kein Problem. Aber will ich einen Knopf auf dem Client provzieren, schmiert FHEM nicht nur erfolgreich sondern auch reproduzierbar ab.

set telegr_bot message (hallo) kuckuck

führt im Log zu

2017.12.16 22:17:42 4: TelegramBot_Set telegr_bot: called
2017.12.16 22:17:42 4: TelegramBot_Set telegr_bot: Processing TelegramBot_Set( message )
2017.12.16 22:17:42 4: $VAR1 = {
          'one_time_keyboard' => bless( do{\(my $o = 1)}, 'JSON::PP::Boolean' ),
          'keyboard' => [
                          [
                            'hallo'
                          ]
                        ]
        };

encountered object '1', but neither allow_blessed, convert_blessed nor allow_tags settings are enabled (or TO_JSON/FREEZE method missing) at ./FHEM/50_TelegramBot.pm line 1960.


Die Zeilennummer mag nicht mit dem Originalmodul übereinstimmen, weil ich doch schon so viel im Modul rumgekritzelt hab.

Ein 'allow_blessed' im JSON Konstruktor verhindert den Fehler, aber dann ist im JSON Text für das "one_time_keyboard" eine "null" eingetragen.  Und damit kann dann der Client nix anfangen.

Völlig verrückt ist (macht mich) der Umstand, dass ich in meinem gesamten Raspi Stretch Dateisystem keine Datei finde, aus der diese Fehlermeldung stammen könnte.  In dem Perl-JSON Paket kommt das "allow_tags" aus der Fehlermeldung ja gar nicht vor...

Hat sich in jüngerer Zeit für Stretch irgendwas an den JSON Sachen geändert, die von der breiten Masse der ambitionierten FHEM Nutzer gar nicht wahrgenommen werden?
Ich musste in 10_pilight_ctrl.pm auch schon ein allow_nonref einfügen, zu dem ich im Forum sonst keine Aufschreie finden konnte...

Wer weiß was???

;-)
b.

Blechzwerg

mOin,

ich hab für mein Problem einen Workaround gefunden.  Allerdings finde ich ihn unbefriedigend...

Ich hab in 50_TelegramBot.pm die Boolean Flags JSON::true und JSON::false durch \1 und \0 ersetzt, z.B. so um die Zeile 1950


    #%par = ( "hide_keyboard" => JSON::true );
    %par = ( "hide_keyboard" => \1 );
  } else {
    return $ret if ( ! @keys );
    #%par = ( "one_time_keyboard" => (( ( defined( $onetime_hide ) ) && ( $onetime_hide ) )?JSON::true:JSON::true ) );
    %par = ( "one_time_keyboard" => \1  );
    $par{keyboard} = \@keys;


Dann funktioniert die JSON kodierung zu "true" und "false", und ich seh Knöpfchen auf meinem Telefon.

Zur Sicherheit hab ich den encode-Aufruf noch durch ein eval geschützt, damit nicht das ganze FHEM den Abflug macht...


  my $json        = JSON->new->utf8->allow_nonref;
  eval {
    $ret = $json->utf8(0)->encode( $refkb );
  };
  Log3 $name, 2, "JSON encode() did fail with: $@" if $@;


Unbefriedigend ist das zweifellos, weil es sicher nicht der Zweck von JSON::true/false ist, nicht verwendet zu werden.  Auch die Fehlermeldungen des JSON Moduls, dass man doch bitte convert_blessed bzw. allow_blessed verwenden soll - was aber keine erkennbaren Auswirkungen hat, lassen diesen JSON Kram in keinem guten Lichte dastehen.  Über die Beschwerde, dass $refkb angeblich keine Referenz sei und nur mit allow_nonref akzeptiert würde, kann ich mich schon gar nicht mehr aufregen...

Da das Problem scheinbar nicht weit verbreitet zu sein scheint, kann es natürlich an meiner speziellen Installationskonstellation liegen.  Obschon ich auch nix anderes mache als apt-get aus den üblichen Quellen.

;-)
b.

viegener

Wenn Du eine Veränderung des Teleram-Bots brauchst, wäre der beste Weg nach einer Erweiterung zu fragen. Ein modifiziertes Modul zu debuggen, ohne, dass Du den source-code postest ist wenig hilfreich - mal davon abgesehen, dass ich da auch eher ungern helfen würde - denn was kommt da zur Community zurück.

Also mein Vorschlag: Wenn Du eine Funktionalität vermisst - beschreib doch lieber was benötigt wird...
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Blechzwerg

mOin,

schon klar.  Aber ich vermisse ja keine Funktionalität, sondern die vorhandene tut's bei mir nicht.  Und ich habe eben auch gar nicht das TelegramBot Modul in Verdacht.

Wenn bei Dir ein
set telegr_bot message (hallo) kuckuck
in der Kommandozeile der FHEM Webseite funktioniert, würdest Du mir ja eh nicht beim Debuggen helfen können. Mir schmierte FHEM dabei allerdings ab...

Mein Beitrag sollte nur erwähnen, dass ich dieses Problem mit JSON Objekten habe, und dass ich einen schmutzigen Workaround hab. 
Wenn dieses Problem z.Zt. sonst niemand hat, ist mein Beitrag sicher nicht soooo spannend. ;-)
Meine Modifikationen hab ich ja übrigens durchaus mitgeteilt.

Alles gut.
;-)
b.

viegener

@Blechzwerg: Doch vermutlich kann man schon helfen: Nimm mal das Originalmodul - setze verbose auf 5 - sende das Kommando und gib den Log-auszug der entsteht heir in Codetags.

Ausserdem wäre es gut über Deine Umgebung - Betriebssystem, Plattform, perl-Version und auch wie Du die JSON-Lib installiert hast (und welche).


Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Blechzwerg

moin,

Du hast es so gewollt...  ;-)

Raspi3 mit Raspbian Stretch
Perl 5.24.1

Ich installiere alles mit apt-get aus diesen Quellen:

deb http://apt.pilight.org/ stable main

deb http://archive.raspberrypi.org/debian/ stretch main ui
deb http://mirrordirector.raspbian.org/raspbian/ stretch main contrib non-free rpi

deb http://www.lesbonscomptes.com/upmpdcli/downloads/raspbian-stretch/ stretch main



pi@raspi0:/opt/fhem $ apt list --installed | grep perl | grep -i json
libjson-perl/stable,now 2.90-1 all  [installiert]
libjson-xs-perl/stable,now 3.030-1 armhf  [Installiert,automatisch]


Der lapidare Fehler mit dem Originalmodul:

...
2017.12.17 15:04:57 5: TelegramBot_Get telegr_bot: called
2017.12.17 15:04:57 5: TelegramBot_Get telegr_bot: Processing TelegramBot_Get( ? )
2017.12.17 15:05:13 4: TelegramBot_Set telegr_bot: called
2017.12.17 15:05:13 4: TelegramBot_Set telegr_bot: Processing TelegramBot_Set( message )
hash- or arrayref expected (not a simple scalar, use allow_nonref to allow this) at ./FHEM/50_TelegramBot.pm line 1954.

... und FHEM ist weg. Aber ganz weit weg!

Mit allow_nonref in Zeile 1953, wie in meinem 2. Posting zum Workaround zitiert, verschwindet dieser Fehler, und es erscheint:

...
2017.12.17 15:09:42 4: TelegramBot_Set telegr_bot: called
2017.12.17 15:09:42 4: TelegramBot_Set telegr_bot: Processing TelegramBot_Set( message )
encountered object '1', but neither allow_blessed, convert_blessed nor allow_tags settings are enabled (or TO_JSON/FREEZE method missing) at ./FHEM/50_TelegramBot.pm line 1954.

... und FHEM ist wieder weg.

Dieses ist nun die Fehlermeldung, die ich im Klartext in keiner (Perl) Datei im gesamten Filesystem des Raspi finden kann.  Nur ganz ähnliche gibt es in den JSON Modulen.

Es ist nicht viel, was JSON uns da verrät (und es sind ja eindeutig Abstürze aus dem JSON nicht aus dem TelegramBot).

Ich hoffe, ich war vollständig.
Vielen Dank für Deine Neugierde.

;-)
b.

viegener

Das klingt erstmal einfach - versuch mal die neueste Telegrambot-Version

Das allow_nonref-Problem in neuen perl-JSON-Versionen habe ich da drin (allerdings ist das in Zeile 216x bei mir, also vermute ich Deine Version ist schon etwas angestaubt)



Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Blechzwerg

mOin,

jetzt der Nachweis, warum ich im Anfängerforum startete: Liefert mir ein "update" nicht die neueste Version?

Mit der durch "update" ausgelieferten Version hab ich ja den Fehler nachgestellt.
Ich bin grad auch mal zu svn.fhem.de gesurft, aber da hab ich auf trunk die Version vom 11.11. gefunden, die mit meiner "Fehler"Version identisch ist.

Ich hab auch in der Tat mehrere Stellen gefunden, in denen Du schon allow_nonref und eval {} eingebaut hattest - bloß an 'meiner' Stelle noch nicht. Wobei das allow_nonref ja nur der Tragödie erster Teil ist.

;-)
b.

viegener

Na ja - erstmal muss ich sagen, der encode-Teil ist mir entgangen - das muss ich wirklich anpassen und auch noch ohne eval.
Fix ist in github

Ich muss zugeben, ich konnte das mit den allow_nonref nie testen, da ich kein so neues System / perl aufgesetzt habe.
Also bist Du jetzt mein Opfer  ;)

dann schauen wir mal weiter nach dem nächsten Problem - da muss ich mich vermutlich erst einlesen...


Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

viegener

Für das zweite Problem:

Schau mal hier:

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=869641

Zitat> This is #848041, merging.
>
> I believe this is a combination of mod_perl + libjson-xs-perl and that
> removing libjson-xs-perl from your system should fix the issue.
>
> Does this work for you as a workaround/solution?

It does indeed (apt installed libcpanel-json-xs-perl instead).  Thanks for the help.

Vielleicht hilft das auch bei Dir?
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Blechzwerg

mOin,

ganz sicher sogar!  :D

JSON-XS Paket entfernt, meinen schmutzigen Workaround ausgebaut.  Nur das eval{ allow_nonref } drin gelassen (wie es ja sicher bald übers update verteilt wird) - und tatsächlich Tasten auf dem Telegram Client.

Vielen Dank für den entscheidenden Hinweis!
;-)
b.

viegener

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können