FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: billy-boy am 05 Januar 2016, 01:19:12

Titel: httpmod, attr set*TextArg
Beitrag von: billy-boy am 05 Januar 2016, 01:19:12
Hallo

Ich bastle seit geraumer Zeit an einer App für mein Samsung TV. Es hatte leider keine Message-Funktion mehr.
Meine App kann man mit httpmod ansprechen und so ist es mir möglich wieder meine geliebten Telefonnummern am Fernseher zu sehen.

Es wäre auch ganz nett wenn mit zusätzlich der Name angezeigt würde.

Wenn das Attribut set*TextArg gesetzt ist, ist es ja seit dem letzten Update vom httpmod möglich auch Text zu senden.
Allerdings darf keine Leerzeile im Text sein.

Will man "Max Mustermann" anzeigen lassen wird daraus nur Max.

Max_Mustermann wird korrekt angezeigt.

Ich lese allerdings das Phonebook der Fritz aus und dort sind die Namen mit Leerzeichen hinterlegt.
Diese Namen werden ja auch so auf dem Telefon angezeigt.

Ist es irgendwie möglich mit Leerzeichen zu senden?
Wäre auch interessant für ganze Sätze als Meldungen auf dem Fernseher.

Bin gespannt auf Eure Antworten

Gruß

billy-boy



Titel: Antw:httpmod, attr set*TextArg
Beitrag von: viegener am 05 Januar 2016, 01:37:49
ich kenne die beteiligten Module jetzt nicht bzw. kann sie aus der Beschreibung nicht nachvollziehen. Wenn der Text aber per http an den Fernseher geht (auch indirekt), dann könnte es sein, dass Du statt Leerzeichen mal  %20 einsetzen. Das ist eine Codierung für ein Leerzeichen im Web.

Johannes
Titel: Antw:httpmod, attr set*TextArg
Beitrag von: billy-boy am 05 Januar 2016, 13:20:31
Hallo Johannes

Danke für deine Antwort. Allerdings würde das bedeuten,dass ich die bereits vorhandenen,
hinterlegten Namen alle erst einmal abfangen und mit %20 auffüllen müsste.

Dieses will ich ja gerade verhindern, da ich dann auf dem TV das ganze wieder rückgängig machen müsste
um das gewünschte Format zu bekommen.

Der Client mit dem man die App testen kann, kann ja auch ganze Sätze übermitteln.
Nur mit fhem bekomme ich es nicht hin.

Gruß

billy-boy
Titel: Antw:httpmod, attr set*TextArg
Beitrag von: viegener am 05 Januar 2016, 14:17:56
Nein, der Vorschlag war es mal entsprechend auszuprobieren, vielleicht wird die %20 automatisch am Fernseher etc zurückkonvertiert.
Denn %20 ist eine übliche Darstellung für ein Leerzeichen

Titel: Antw:httpmod, attr set*TextArg
Beitrag von: viegener am 05 Januar 2016, 14:26:10
Und noch zusätzlich, wenn Du httpmod nutzt nehme ich an, es wird alles als HTTP-GET (und nicht POST gesendet), dann ist die Codierung für ein Leerzeichen als %20 sogar Pflicht (schaue mal unter urlencoding in google).

Denn ich verstehe die Commandref so, dass die Daten bereits entsprechend codiert sein müssen:

Zitat
set[0-9]*TextArg
Defines that this set option doesn't require any validation / conversion. The raw value is passed on as text to the device.

Titel: Antw:httpmod, attr set*TextArg
Beitrag von: billy-boy am 05 Januar 2016, 22:27:10

Deine Annahme ist falsch. Es wird über POST versendet und nicht über GET.
Die API die Samsung zur Verfügung stellt kann nur POST-Befehle annehmen.
Deswegen ist der httpmod ja so ideal dafür. Um einfache Get-Befehle benötigt man den HTTPMOD nicht.

Wenn ich "Max%20Mustermann" eingebe wird auch "Max%20Mustermann" angezeigt.

Allerdings habe ich festgestellt, dass es irgendwie wahrscheinlich an httputils liegen wird.
Wenn ich "Max Mustermann" direkt über HTTPMOD eingebe steht im LOG  "Message:Max"
Er schneidet mir also den Nachnahmen vor dem Senden ab. Ohne Leerzeichen wird alles durchgereicht.

Das Klingeln des Telephones fange ich mit DOIF ab und auch der macht mir aus "Max Mustermann" nur "Max". (so steht es im LOG).
Auch hier wird bei fehlendem Leerzeichen alles durchgereicht.

Gruß
billy-boy

Titel: Antw:httpmod, attr set*TextArg
Beitrag von: viegener am 05 Januar 2016, 22:46:17
Damit ich nicht weiter rumraten muss, was Du eigentlich machst, wäre es vermutlich hilfereich mal ein paar Details zu sehen. Ich verstehe immer weniger wo das Leerzeichen überall ein Problem ist. Offensichtlich im DOIF und warum im httputils?

Vielleicht kannst Du ein list der relevanten devices machen (insbesondere des http utils und des DOIF), dann kann man sich das anschauen und vielleicht finden wir das Problem dann.
Titel: Antw:httpmod, attr set*TextArg
Beitrag von: billy-boy am 06 Januar 2016, 01:34:58
Was ich mach ist ganz einfach.

Die älteren Samsung TV Geräte hatten eine Messanger Funktion. Man konnte ganz einfach mit


fb:event:.ring* {
my $inumber = ReadingsVal("fb", "internal_number", undef);
my $enumber = ReadingsVal("fb", "external_number", undef);
my $extname = ReadingsVal("fb", "external_name", undef);
$extname =~ s/ / /g;
GetHttpFile( "IP des anzusprechenden Gerätes/control/message?popup=Eingehender%%20Anruf%%20von%%3A%%0A%%0ARufnummer%%3A$enumber%%0AAnrufer%%3A${extname}%%0AAnruf an%%3A",$inumber);

}


die Telefonnummer und den Namen des Anrufers anzeigen lassen.

Diese Funktion haben die neueren Geräte aber nicht mehr.

Samsung stellt allerdings für die App-Entwickler API's zur Verfügung die ich nutzen möchte um diese Anzeigen wieder hinzubekommen,
oder vielleicht sogar noch mehr. (Bild des Anrufers oder auch Temperaturanzeigen der Wohnräume auf dem Fernseher nach Tastendruck)

Diese API wird allerdings mit POST-Befehlen angesprochen.
Hier kommt der Httpmod ins Spiel. Er kann bei richtiger Einstellung diese API ansprechen und die entsprechenden Werte übermitteln.
Er kann auch mit seinem Attribut 'disable' auch an und aus geschaltet werden.

Stellt man disable jetzt in Abhängigkeit zum Telefonanruf, stellt er eine Verbindung zum Fernseher her.
Ob diese Verbindung besteht wird mit DOIF überwacht und der Set-Befehl gesetzt


([HTTPMOD:VerbindID] eq "1234") (Sleep 1, setreading HTTPMOD VerbindID connected,  set HTTPMOD Message [fb:external_number][fb:external_name]) DOELSE (setreading HTTPMOD VerbindID not connected)


Im Log steht dann (Msg.an.TV ist der define de DOIF)

2016.01.05 22:18:41 2: Msg.an.TV:   set HTTPMOD Message 0123456789Max Mustermann: Message -> 0123456789Max

Der DOIF schneidet also schon bei der Übergabe des Sets den Nachnahmen aufgrund des Leerzeichens ab.
Nun kann man den Set-Befehl auch direkt in HTTPMOD mal als Test eingeben.
Schreibt man hier '0123456789Max Mustermann' steht im Log

2016.01.05 22:33:28 4: HTTPMOD: set will now set Message -> 0123456789Max

Also wieder ohne Nachnahme auf Grund des Leerzeichens

Irgendetwas kann also die Leerzeichen nicht verarbeiten und ich möchte wissen woran das liegt.
Irgendein Modul was von DOIF und HTTPMOD benutzt wird ?
Ich weiß es nicht und wäre für jeden Tipp dankbar

Gruß

billy-boy

Titel: Antw:httpmod, attr set*TextArg
Beitrag von: viegener am 06 Januar 2016, 14:48:49
OK, habe mir gerade mal die Stellen in HTTPMod angeschaut, es sieht für mich so aus, als ob HTTPMod nicht mit mehreren Parametern für den set umgehen kann (duch das Leerzeichen werden es ja mehrere Parameter). Weitere Parameter fallen weg.

Folgende Alternativen:
- Schauen, ob der Modulautor das ändern will
- Workaround mit Unterstrichen -> also im DOIF nicht direkt [fb:external_number][fb:external_name] übergeben, sondern
den Text erst über eine Funktion leiten, die alle Leerzeichen/Tabs in Unterstriche verwandelt.
Auf Perlebene ist das ganz einfach:

my $setval = "[fb:external_number][fb:external_name]";
$setval =~ s/\d/_/g;
fhem( "set HTTPMOD Message $setval" );

- Weiter nach Zeichen suchen, die vom Samsungfernseher als Leerzeichen akzeptiert werden (z.B. \x20)
=> Aber auch dafür müsstest Du Ersetzungen vor dem Aufruf machen

Titel: Antw:httpmod, attr set*TextArg
Beitrag von: billy-boy am 07 Januar 2016, 00:55:49
So was habe ich mir gedacht und wollte es eigentlich umgehen, da ich relativ wenig Zeit habe.
Wenn alles normal laufen würde, wäre die Aktion ja auch unnötig.

Die ersten HTTPMOD Versionen konnten gar kein Text übermitteln nur numerische.
Ich habe damals die Abfrage ob numerisch oder nicht für mich einfach aus dem Modul genommen.

Hatte irgendwie die Hoffnung, dass das hier auch möglich ist, aber ich kann die Stelle einfach nicht finden.

Werde mich jetzt am Wochenende wieder mal damit beschäftigen und dann die Leerzeichen mit Unterstrich versehen.
Die Frage ob der Fernseher das kann stellt sich nicht, denn die Kapp ist in Javascript und HTML also kann das
genauso wie in Perl wieder rückgängig gemacht werden. Er kann also alles was man Ihm vorgibt.

Ich bin aber immer der Meinung man sollte so wenig wie möglich Codex schreiben, damit Aussenstehende das Skript
besser und schneller verstehen können.

Danke für deine Hilfe.Ich werde nach Abschluß der Umstellung berichten ob es funktioniert.

Gruß

billy-boy




Titel: Antw:httpmod, attr set*TextArg
Beitrag von: viegener am 07 Januar 2016, 01:12:00
Bitte gern geschehen, wenn Du selber eine Änderung versuchen willst, der Ansatz ist in Zeile 385 / HTTPMOD:
    my ($name, $setName, $setVal) = @a;

Hier wird jedes weitere Argument, dass im Array nach setVal steht ignoriert. Damit werden die weiteren Teile für mehrteilige Set-Werte ignoriert.

Johannes
Titel: Antw:httpmod, attr set*TextArg
Beitrag von: billy-boy am 07 Januar 2016, 23:41:58

So ich habe mir nocheinmal alles angeguckt. Es liegt definitiv nicht am HTTPMOD.
Gebe ich die Sätze direkt unter Data ein, wird alles korrekt mit Leerzeichen übergeben.

Der Grund für mein Problem liegt am Set-Befehl.
Wer lesen kann ist klar im Vorteil, denn in der Commandref steht unter Geräte-Spezifikation (devspec):

Zitat

Bemerkungen:

    die Spezifikation kann keine Leerzeichen enthalten.


Damit ist klar, dass ich wirklich alle Leerzeichen vorher entfernen oder Auffüllen und hinterher am TV den Vorgang wieder rückgängig machen muß.

Scheiße aber nicht zu ändern. Wird für mich zu eine zeitintensive Aktion.

Gruß

billy-boy


Titel: Antw:httpmod, attr set*TextArg
Beitrag von: viegener am 08 Januar 2016, 01:05:33
Zitat von: billy-boy am 07 Januar 2016, 23:41:58
So ich habe mir nocheinmal alles angeguckt. Es liegt definitiv nicht am HTTPMOD.
Gebe ich die Sätze direkt unter Data ein, wird alles korrekt mit Leerzeichen übergeben.

Der Grund für mein Problem liegt am Set-Befehl.
Wer lesen kann ist klar im Vorteil, denn in der Commandref steht unter Geräte-Spezifikation (devspec):

Damit ist klar, dass ich wirklich alle Leerzeichen vorher entfernen oder Auffüllen und hinterher am TV den Vorgang wieder rückgängig machen muß.

Scheiße aber nicht zu ändern. Wird für mich zu eine zeitintensive Aktion.

Gruß

billy-boy

Das ist beides ein Irrtum:

- die Commandref-Bemerkung bezieht sich auf die devspec nicht auf die Parameter im hinteren Teil.

- Die weiteren Parameter im set-Befehl werden von den Modulen selbst analysiert (insofern gibt es da unterschiedliche Vorgehensweisen)

- Die Zeile von oben bezieht sich auch nicht auf die HTTP-Übertragung sondern auf das Parsen der Parameter im set-Befehle durch HTTPMOD.
Es gibt einige set-Befehle (z.B. auch in meinen Modulen) die mehrere Parameter getrennt durch Leerzeichen erlauben und/oder Texte zusammenziehen. Insofern hat HTTPMOD hier meines Erachtens keinen Fehler, aber es könnte eine sinnvolle Erweiterung sein.

Gruss,
Johannes
Titel: Antw:httpmod, attr set*TextArg
Beitrag von: billy-boy am 08 Januar 2016, 12:30:09
Das habe ich bis jetzt auch gedacht, aber wenn ich die Daten nicht über Set eingebe,
sondern direkt in der Database dann klappt auch alles.
Desweiteren würde das auch den Fehler in der DOIF erklären.
Auch hier wird mit Set gearbeitet und das Modul schneidet nach den Leerzeichen alles an.

Gruss

billy-boy
Titel: Antw:httpmod, attr set*TextArg
Beitrag von: viegener am 08 Januar 2016, 17:57:38
Zitat von: billy-boy am 08 Januar 2016, 12:30:09
Das habe ich bis jetzt auch gedacht, aber wenn ich die Daten nicht über Set eingebe,
sondern direkt in der Database dann klappt auch alles.
Desweiteren würde das auch den Fehler in der DOIF erklären.
Auch hier wird mit Set gearbeitet und das Modul schneidet nach den Leerzeichen alles an.

Gruss

billy-boy

Wie gesagt: es ist im set vom httpmod, das doif weiss nichts davon wieviel parameter das set benötigt und kann deshalb auch mit leerzeichen umgehen. Ich habe nicht ohne grund die exakte zeile angegeben  ;)

Was auch immer mit direkt in der datenbank heissen soll...
Wenn es in einem attribut steht geht es natürlich, da es nicht über den set von httpmod geht.
Titel: Antw:httpmod, attr set*TextArg
Beitrag von: viegener am 08 Januar 2016, 18:02:18
Achso noch die frage wo ist ei. Fehler im doif?

Die log meldung sagt doch dass das doif den set korrekt ausführt und das ergebnis das aus httpmod zurückkommt ist abgeschnitten.

Titel: Antw:httpmod, attr set*TextArg
Beitrag von: billy-boy am 08 Januar 2016, 22:09:05
Dein letzter Satz hat mir zu denken gegeben.
Wenn der erste Teil wirklich die Ausführung des DOiIFs ist und der zweite Teil die Rückantwort des
HTTPMODs, hast du natürlich recht.
Dann werde ich mal den Modulschreiber kontaktieren.

Gruss

billy-boy