Hallo Forum (und ein "Frohes Neues Jahr"!),
da die allermeisten "wie steuere ich FHEM per html"-Beiträge im Bereich Anfängerfragen stehen, stelle ich meine Frage mal dazu.
Ich habe mir ein NAS angeschafft und dort einen webserver für ein Intranet (also nur lokales LAN) installiert.
Von einer der Intranetseiten (Joomla) möchte ich (unabhängig vom FHEM floorplan) einen dummy schalten (als "Schnellverknüpfung" quasi).
Ich habe eine FHEM WEBapi mit eingeschr. Zugriff definiert und kann meinen Befehl problemlos per
http://meineIP:Port/fhem?cmd.dummy=set%20MeinDummy%20on
ausführen.
Leider wird dann immer die komplette FHEM Seite der Webinstanz oder (mit "&XHR=1") eine weisse Seite geöffnet.
Ich möchte aber auf der Intranet-Seite bleiben und möchte auch keine neuen Tabs öffnen.
Eventuell ist das auch eine html-Frage, habe auch schon einige Vorschläge dazu gelesen (transparenter Ziel-frame, usw.), aber nichts davon hat funktioniert.
Im Forum habe ich nichts zielführendes gefunden oder es nicht verstanden. Weiss jemand weiter? Javascript? CSS? FHEM-notify auf Abfrage?
Gruß, Jochen
Hallo Jochen,
es gibt sicherlich verschiedene Wege.
Aber sofern du ein Synolog NAS hast, könnte dir dieses Verfahren https://wiki.fhem.de/wiki/SSChatBot_-_Integration_des_Synology_Chat_Servers#Ausl.C3.B6sen_eines_Set-Befehls_in_FHEM_durch_eine_Synology_Surveillance_Station_Aktionsregel
helfen.
Das Beispiel ist zwar für die Surveillance Station, aber das Prinzip könntest du adaptieren.
Grüße,
Heiko
Mmm... tut mir leid, ich verstehe nur Bahnhof. :)
Ja, ich habe eine Synology DS218play. Ich habe jetzt den SSChatBot in FHEM installiert und auch die Chat-Application auf der Synology.
Zitataber das Prinzip könntest du adaptieren.
Mir fehlt es an der "Adaption". Was sende ich jetzt per html wohin und was ändert das an der Tatsache, dass das klicken eines HTML-links eine URL in einem Fenster oder Tab öffnet?
Fragen über Fragen...
Kein Problem :)
Du bist jetzt also in der Lage einen Set-Befehl über die Chat-Applikation (Chat) auszulösen:
/set <Device> <Befehl>
richtig ?
Ich grätsch mal ganz kurz mit javascript dazwischen (weil irgendwie dachte ich ging es [auch] um das Absetzen eines Befehls aus einer Webseite!?)...
...und dann bin ich wieder ruhig ;)
<html>
<head>
<script type='text/javascript'>
const Http = new XMLHttpRequest();
function KlickMich()
{
Http.open("GET","http://meineIP:Port/fhem?cmd.dummy=set%20MeinDummy%20on&XHR=1");
Http.send();
}
</script>
</head>
<body>
<button onclick="KlickMich()">Setze Dummy</button>
</body>
</html>
Hat bei mir zumindest funktioniert (also nat. mit "meinem" fhem und "meinem" Dummy ;) )...
Gruß, Joachim
ZitatIch grätsch mal ganz kurz mit javascript dazwischen
Mach ruhig, Joachim. Ich weiß ja momentan auch noch nicht ob mein Vorschlag letztendlich zum Erfolg führt. ;)
Zitat von: DS_Starter am 04 Januar 2020, 12:09:40
Mach ruhig, Joachim. Ich weiß ja momentan auch noch nicht ob mein Vorschlag letztendlich zum Erfolg führt. ;)
Hi Heiko, ok, wir werden sehen "wo wir rauskommen" ;)
Gruß, Joachim
Vielen Dank für Eure Antworten. Leider habe ich noch keinen Erfolg.
1)
ZitatDu bist jetzt also in der Lage einen Set-Befehl über die Chat-Applikation (Chat) auszulösen:
Code: [Auswählen]
/set <Device> <Befehl>
richtig ?
Leider nein:
Senden der Anfrage an den Bot-Server fehlgeschlagen. Bitte kontaktieren Sie den Bot-Besitzer.
allerdings habe ich die ganze Zeit mit etwas anderem experimentiert (siehe unten) - vermutlich bin ich nicht genug in die Tiefe gegegangen - ich gucke nochmal genauer...
Zitat
Ich grätsch mal ganz kurz mit javascript dazwischen (weil irgendwie dachte ich ging es [auch] um das Absetzen eines Befehls aus einer Webseite!?)...
Genau. Mein Problem ist: mein Inhalt ist in einem "Custom-HTML-Modul" von Joomla. Mit abgeschalteten Editor (also per Quelltext) bekomme ich den Code da rein - der Button wird angezeigt aber nichts passiert.
Vermutlich braucht es ein Plugin, um JS in einem Modul auszuführen. Alle "Code anywhere"-Plugins, die ich gefunden habe, sind für Joomla 3.9.0 "or higher", ich habe 3.8.8 auf der Synology. Ich kann noch nichtmal upgraden, weil ich meine Erstinstallation versehentlich php5.6 installiert habe. Ein Upgrade auf 7.x (plus Änderung der .htaccess) zerschiesst mir die Verbindung zur MariaDB. Baustelle über Baustelle...
Ich hatte allerdings einen ganz anderen Ansatz verfolgt: ich hatte mich an den "Pageswap Dummy" erinnert und mich am Nachfolger "trigger WEB" versucht. Also: dummy per html schalten --> FHEM Seite wird aufgerufen --> Seite soll zurück auf meine "Intranet"-Seite.
Damit wäre ich schon glücklich. Folgendes habe ich versucht:
define webswitch dummy
attrib webswitch setList on off
define webswitch_notify notify webswitch:.* trigger WEBapi JS:location="http://meineSeite"
Aus dem FHEM WEB geht das auch, per HTML bleibt das leider auf der FHEM-Seite stehen
Wenn ich sowas mache:
define webswitch_notify webswitch:.* set Lampe1 on
dann funktioniert das via html.
Warum wird die Seite bei html-Fernsteuerung nicht neu geladen?
Über Hinweise in alle diskutierten Richtungen bin ich dankbar :)
Damit es nicht zu sehr durcheinander geht, solltest du dich erstmal entscheiden eine Variante auszuprobieren und wenn diese nicht zum Erfolg führt die nächste anzugehen. Sonst überfordert (mich) das. :D
Ja, ich weiss - Sorry. Ich hatte mir das irgendwie alles einfacher vorgestellt.
Mir gefällt momentan der letzte Ansatz am besten - weil: NAS-unabhängig und FHEM-eigen...
Alleine beim Joomla-Krams auf der Synology bekomme ich (noch mehr) graue Haare 8)
Ok, dann komme ich wieder ins Spiel falls du mit Synology Chat etwas weitermachen willst. :)
LG,
Heiko
Hmm, allerdings bin ich bei joomla auch keine Hilfe.
Ich dachte du könntest/wolltest eine "einfache" HTML-Seite haben mit Knöpfen etc. ;)
Habe leider keine Umgebung wo ich da mal testen könnte...
Aber wie bekommst du denn den Aufruf jetzt "rein"?
Weil irgendwie dachte ich es geht ja (prinzipiell nur nicht wie du willst ;) )...
Gruß, Joachim
@Joachim: der Aufruf mit dem Script kommt gar nicht rein (in das FHEM), ich vermute, weil das Script im Modul nicht läuft
EDIT: Falls Du damit meinst, wie die aktuelle Situation ist: über den direkten link geht es, es öffnet halt nur eine ungewollte FHEM-Seite und ich bin von meiner Intranet-Seite weg
@ Heiko:
Ich habe den Port der ausgehenden URL im Chat/Einbindungseinstellungen korrigiert. Jetzt ist die Fehlermeldung weg.
Im FHEM kann ich den ChatUser der NAs jetzt mit "get chatbot chatuserlist" sehen.
Ein device kann ich über eine chat mit dem Bot aber nicht schalten.
EDIT: allowedUserforSet usw. ist gesetzt
Zitat von: joginet am 04 Januar 2020, 15:13:29
@Joachim: der Aufruf mit dem Script kommt gar nicht rein (in das FHEM), ich vermute, weil das Script im Modul nicht läuft
EDIT: Falls Du damit meinst, wie die aktuelle Situation ist: über den direkten link geht es, es öffnet halt nur eine ungewollte FHEM-Seite und ich bin von meiner Intranet-Seite weg
Hmm, aber wie "machst" du das aktuell!?
Also wo wie gibst du den "Link" ein?
Einfach "irgendwo" in einem Browser oder schon "irgendwie so wie das später mal soll"?!
Ich weiß grad nicht wie es denn gedacht ist!?
Also wenn ich einen "Intranet-Server" hätte, dann würde ich wollen, dass ich dort Webseiten ablegen kann...
Und das java-Script läuft ja im Browser...
Ich dachte du willst eben auf deinem Intranetserver eine Seite mit einem Knopf und wenn du da drauf drückst soll in fhem was passieren aber die Seite soll bleiben!?
also irgendwie habe ich da noch einen "Wurm im Kopf"... ;)
Zitat von: joginet am 04 Januar 2020, 15:13:29
@ Heiko:
Ich habe den Port der ausgehenden URL im Chat/Einbindungseinstellungen korrigiert. Jetzt ist die Fehlermeldung weg.
Im FHEM kann ich den ChatUser der NAs jetzt mit "get chatbot chatuserlist" sehen.
Ein device kann ich über eine chat mit dem Bot aber nicht schalten.
Daher würde ich sagen: Heiko du bist wieder im Rennen bzw. sogar "Pole Position" ;)
Gruß, Joachim
@Joachim ... ich wollte gerade Kaffee trinken ;D *grins*
ZitatEin device kann ich über eine chat mit dem Bot aber nicht schalten.
Also du gehst z.B. in der mobilen App auf dem Tablet/Telefon in den Kanal des Bots, bei mir heißt der FHEM_Prod und sendest dort als Beispiel:
/set eg.wz.schrankwand on
Damit schaltet bei mir eine Lampe an.
Wenn das nicht funktioniert, dann bitte im SSChatBot-Device und dem mit angelegte WEB-Device (
WEBSSChatBot) verbose 5 setzen und die Logausgabe posten. Dann sieht man was nicht geht.
ZitatHmm, aber wie "machst" du das aktuell!?
Also wo wie gibst du den "Link" ein?
http://meineIP:Port/fhem?cmd.dummy=set%20MeinDummy%20on
Ein "Modul" beim joomla kann auch "custom html" sein, also ein Abschnitt mit eigenem html auf einer (joomla)-webseite.
Da ist bei mir ein Bild/icon drinne mit dem link drauf. Der schaltet so wie er soll, aber macht halt ein Fenster auf (das soll er nicht).
Das Problem am Joomla Modul ist, dass da (zumindest per default) nur html läuft - kein css, kein js, usw.
Dafür gibt es Plugins, die das ermöglichen (siehe Problematik oben).
Im "gesamt-html" der Seite bringt es nichts, da es 1) die Struktur zeschiesst und 2) ich den link ja genau an der Stelle meines Moduls haben möchte.
ZitatIch dachte du willst eben auf deinem Intranetserver eine Seite mit einem Knopf und wenn du da drauf drückst soll in fhem was passieren aber die Seite soll bleiben!?
genau.
Ich verstehe das immer noch nicht...
Aber wie geschrieben ich kenne mich bzgl. joomla nicht (wirklich) aus...
Aber was macht denn das java-Script da für Probleme?
Es ist doch eingebettet in html, sollte also doch eine "ganz normale html-Seite" sein!?
Das java-Script wird ja doch im Browser der die Seite lädt abgearbeitet...
Aber egal, ich denke der andere Weg ist besser!? ;)
Gruß, Joachim
ZitatWenn das nicht funktioniert, dann bitte im SSChatBot-Device und dem mit angelegte WEB-Device (
WEBSSChatBot) verbose 5 setzen und die Logausgabe posten. Dann sieht man was nicht geht.
So sieht es im Log aus:
2020.01.04 15:42:21 4: Connection accepted from WEBSSChatBot_192.xx.x.xxx_xxxx
2020.01.04 15:42:21 4: WEBSSChatBot_192.xxx.x.xxx_xxxx POST /sschat/outchat?botname=SynChatBot&token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&user_id=4&username=xxx&post_id=17179869213&thread_id=0×tamp=1578148941912&text=%2Fset%20Audio1%20on; BUFLEN:0
2020.01.04 15:42:21 4: WEBSSChatBot: /sschat/outchat?botname=SynChatBot&token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&user_id=4&username=xxx&post_id=17179869213&thread_id=0×tamp=1578148941912&text=%2Fset%20Audio1%20on / RL:49 / text/plain; charset=utf-8 / / Cache-Control: no-cache, no-store, must-revalidate
@Joachim
ZitatAber was macht denn das java-Script da für Probleme?
Es ist doch eingebettet in html, sollte also doch eine "ganz normale html-Seite" sein!?
Naja, Joomla ist halt leider keine ganz normale Seite - da liegt ja noch ein Template drüber, was seinerseits Scripte benutzt. Plugins, Module, usw.
Kurz: ich denke, mit einem aktuellen Joomla, php und "Script-anywhere"-Plugin würde das problemlos gehen. Aber bis ich mich da duch die Synology-Foren gelesen habe... ::)
Also das sieht für den Bot doch schon gut aus. Aber da sollte noch mehr kommen:
2020.01.04 15:52:43.120 4: Connection accepted from WEBSSChatBot_192.168.2.10_57573
2020.01.04 15:52:43.121 4: WEBSSChatBot_192.168.2.10_57573 POST /sschat/outchat?botname=SynChatBot&fwcsrf=xxxxxxx&token=xxxxxxxxxxxxxxxxxxxxxxxx&user_id=4&username=Heiko&post_id=68719477648&thread_id=0×tamp=1578149563078&text=%2Fset%20eg.wz.schrankwand%20on; BUFLEN:0
2020.01.04 15:52:43.123 4: SynChatBot - ####################################################
2020.01.04 15:52:43.123 4: SynChatBot - ### start Chat operation Receive
2020.01.04 15:52:43.123 4: SynChatBot - ####################################################
2020.01.04 15:52:43.124 5: SynChatBot - data received:
{
'post_id' => '68719477648',
'text' => '%2Fset%20eg.wz.schrankwand%20on',
'botname' => 'SynChatBot',
'timestamp' => '1578149563078',
'fwcsrf' => 'xxxxxxxx',
'user_id' => '4',
'thread_id' => '0',
'token' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'username' => 'Heiko'
}
2020.01.04 15:52:43.124 4: SynChatBot - user_id received: 4
2020.01.04 15:52:43.125 4: SynChatBot - username received: Heiko
2020.01.04 15:52:43.125 4: SynChatBot - postid received: 68719477648
2020.01.04 15:52:43.125 4: SynChatBot - timestamp received: 2020-01-04 15:52:43
2020.01.04 15:52:43.126 4: SynChatBot - text received: /set eg.wz.schrankwand on
2020.01.04 15:52:43.126 4: SynChatBot - Synology Chat user "Heiko" execute FHEM command: set eg.wz.schrankwand on
2020.01.04 15:52:43.911 4: SynChatBot - FHEM command return: command 'set eg.wz.schrankwand on' executed
Ist der Chat-Bot auch auf verbose 5 ?
Zitat
Ist der Chat-Bot auch auf verbose 5 ?
Jip.
Hmm, komisch. Mach mal bitte ein list vom Bot-Device.
Internals:
DEF 192.xxx.x.xxx xxxx http
FUUID 5e105c05-f33f-70e9-8f0e-b0bc0118bbb7b9b7
FVERSION 50_SSChatBot.pm:v1.1.0-s20534/2019-11-18
FW WEBSSChatBot
INADDR 192.xxx.x.xx
INPORT xxxx
INPROT http
MODEL ChatBot
NAME chatbot
NR 1562
OPMODE chatUserlist
OUTDEF http://pc4-NUC7i5BNH:xxxx/sschat/outchat?botname=chatbot&fwcsrf=5e105c05
RESEND next planned SendQueue start: immediately by next entry
STATE active
TOKEN Set
TYPE SSChatBot
HELPER:
APIINFO SYNO.API.Info
APIPARSET 1
CHATEXTERNAL SYNO.Chat.External
CHATEXTERNALMAXVER 2
CHATEXTERNALPATH entry.cgi
INFIX outchat
PACKAGE main
TOKEN xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
USERFETCHED 1
VERSION 1.1.0
USERS:
pc4:
email
id 4
nickname
status online
READINGS:
2020-01-04 15:29:27 Error none
2020-01-04 15:29:27 Errorcode none
2020-01-04 15:29:27 QueueLenth 0
2020-01-04 15:29:27 state active
Attributes:
allowedUserForCode pc4
allowedUserForGet pc4
allowedUserForOwn pc4
allowedUserForSet pc4
room Chat
verbose 5
ok, jetzt sieht man es:
OUTDEF http://pc4-NUC7i5BNH:xxxx/sschat/outchat?botname=chatbot&fwcsrf=5e105c05
Der Name deine Bots ist "chatbot", angegeben hast du aber in der Applikation als Webhook den Namen:
Zitat
WEBSSChatBot_192.xxx.x.xxx_xxxx POST /sschat/outchat?botname=SynChatBot&token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&user_id=4&username=xxx&post_id=17179869213&thread_id=0×tamp=1578148941912&text=%2Fset%20Audio1%20on; BUFLEN:0
Must du in der Chat-Appikation auf der Syno korrigieren.
EDIT: Und das &fwcsrf=5e105c05 fehlt auch.
Danke erstmal. Leider hab ich jetzt alles verfummelt und muß jetzt erstmal los. ::)
Ich melde mich in Kürze mit einem Ergebnis !
Gruß, Jochen
Das habe ich gleich mal als Anlass genommen um einen entsprechenden Logeintrag zu erzeugen, wenn ein Botname mitgegeben wird der nicht (mit dem richtigen Typ) exitiert.
2020.01.04 17:05:39.127 1: ERROR - No SSChatBot device "SynChatBo" of Type "SSChatBot" exists
Bitte die Version wieder aus meinem contrib ziehen und FHEM restarten.
Grüße,
Heiko
Hallo Heiko,
Danke nochmal, jetzt habe ich mal alles, was mit "chatbot" zu tun hat im FHEM neu angelegt und i.d. Synology entsprechend angepasst.
Und ja, jetzt kann ich per
/set Lampe on
ein FHEM device schalten.
Das war also schonmal Schritt eins - was mache ich jetzt mit meinem html?
Gruß, Jochen
Prima.
Das war die Vorarbeit. Jetzt müsstest du in deiner Joomla Applikation einen solcher Aufruf einbauen:
http://pc4-NUC7i5BNH:<Port>/sschat/outchat?botname=<Botname>&fwcsrf=<csrf-Code>&user_id=4&username=<Username>&token=<Token>&text=%2Fset%20Lampe%20on
Alles natürlich mit deinen korrekten Daten. Du weißt ja jetzt auch welche das sind, Botname und CSRF siehst du im Internal OUTDEF des Bot-DEvices, den Token z.B. über "get .. storedToken" und einen validen User über "get ...chatUserlist".
Naja .. und dann hoffen wir mal dass es so funktioniert wie du dir das wünscht.
EDIT: HTML Aufruf geändert
Hmmm....
Also - der Link schaltet noch nichts, aber das kann auch an meinem Token-Syntax liegen.
Was mir auffällt: in Chat kommt eine Nachricht an, aber unter dem Botnamen, nicht unter dem User-Namen.
Da steht "Please define on first"
Aber: was viel schlimmer ist: nach Ausführen des links im Joomla erscheint eine weisse Seite - auf der steht "success".
Also: gleiches Problem? Etwas an den Bot senden verlinkt genauso wie etwas an FHEM senden?
Gruß, Jochen
Ach sorry, da habe ich in dem Beispiel oben etwas zuviel weggelöscht:
&text=%2Fset%20Lampe%20on
Dann wird das schalten.
ZitatAber: was viel schlimmer ist: nach Ausführen des links im Joomla erscheint eine weisse Seite - auf der steht "success".
Nun das ein Wert zurück gegeben wird kann ich zum Beispiel mit einem Attribut abschaltbar gestalten.
Käme auf einen Versuch an.
Wenn du magst, ergänze den Aufruf so dass es mit dem Schalten klappt und dann würde ich dir eine Version bereitstellen ohne die Rückgabe von "success". Viellicht hilft das dann.
Ja, das geht ! Da hätte ich auf selber drauf kommen können, dass da das Leerzeichen fehlt.
Wenn die success-Seite weg wäre, wäre das prima ;D ;D ;D
So, probiers mal mit der geänderten Version aus meinem contrib. Restart oder reload nicht vergessen.
Ok, hab ich geladen. Muss ich noch ein Attribut setzten?
Nein, aber hast du es gerade erst gemacht ? Wenn ja, müssen wir es nochmal tun, weil ich es inzwischen wieder in den Originalzustand versetzt habe.
PS: mein eigentliches Problem habe ich mittlerweile "umschifft":
ein "sleep 3" vor dem "trigger WEBapi JS:" hat es gelöst:
define webswitch dummy
attrib webswitch setList on off
define webswitchdoif DOIF ([webswitch:state] eq "on") (sleep 3; trigger WEBapi JS:location="http://meineIntranet-Seiten-URL"; set MeinDevice on; set webswitch off)
attrib webswitchdoif do always
funktioniert.
Ich klicke den html-link
http://Meine_WEBapi_URL:Port/fhem?cmd.dummy=set%20webswitch%20on
Die Seite wird kurz auf die FHEM WEBapi-Seite umgeleitet, schaltet gleich wieder zurück auf meine Intranet-Seiten-URL und führt die Aktion (Deveice schalten) aus.
ZitatNein, aber hast du es gerade erst gemacht ?
Ja, gerade erst. Ist es evt. einfacher für Dich, mir die Datei per email zu schicken? Dann melde ich mich per pm...
Jetzt habe ich sie einfach mal hier angehängt.
Wenn du es schon gelöst hast ist das doch prima :)
Wäre noch interessant ob es mit dm Bot nun auch klappt.
Ahh - anhängen geht ja auch :)
Ja - ich teste nochmal eben...
Sooo... schalten geht, das "success" ist weg, aber der link wird leider geöffnet (eine weisse Seite).
Wenn man da jetzt noch ein "redirect" bei "success" einbauen würde ;D
Sorry, Du hast Dir sehr viel Arbeit gemacht.
Aber wer weiss, wozu ich das mal brauchen kann - immerhin spricht die Synology jetzt mit meinem FHEM !
Ich setzte den Beitrag mal auf gelöst, siehe weiter oben:
https://forum.fhem.de/index.php/topic,107003.msg1008861.html#msg1008861 (https://forum.fhem.de/index.php/topic,107003.msg1008861.html#msg1008861)
Vielen, vielen Dank für Deine Mühe !
Gruß, Jochen
Keine Ursache, macht ja Spass und vielleicht kann ich noch etwas sinnvolles erweitern ;)
Du kannst diese Möglichkeiten mit dem Bot bestimmt noch irgendwann brauchen und sei es in Verbindung mit Kameras und SSCam.
Grüße,
Heiko