Neuigkeiten:

Am Sonntag den 8.12.2024 kann es ab ca. 8:00 Uhr zu kurzzeitigen Einschränkungen / Ausfällen bei den Diensten des FHEM Vereines kommen.
Die Server müssen mal gewartet und dabei neu gestartet werden ;)

Hauptmenü

HTTPMOD Anfängerfragen (Nextcloud Talk Chat API)

Begonnen von kamp, 06 Juni 2022, 15:31:55

Vorheriges Thema - Nächstes Thema

kamp

Hallo,

ich habe nach einiger Mühe herausgefunden, wie man HTTPMOD halbwegs verwendet und habe damit über die Nextcloud Talk Chat API die Nachrichten auslesen können. Grundsätzlich beginnt er bei der ersten Nachricht im Chatverlauf, liest Nachricht für Nachricht aus und zeigt diese erstmal nur an. Das Ziel ist, dass ich damit meinen Telegram-Chatbot ersetzen kann, mit dem ich Befehle per Telegram (hoffentlich bald per Talk) in FHEM ausführen kann. So sieht das HTTPMOD dazu aus:

defmod Talk2 HTTPMOD https://bot:password@cloud.deine.url/ocs/v2.php/apps/spreed/api/v1/chat/bparuvcs?lookIntoFuture=1&limit=1&lastKnownMessageId=%%msgid%% 10
attr Talk2 enableControlSet 1
attr Talk2 enableCookies 1
attr Talk2 reading01JSON ocs_data_01_id
attr Talk2 reading01Name LastReceivedMessageID
attr Talk2 reading02JSON ocs_data_01_actorId
attr Talk2 reading02Name LastReceivedSender
attr Talk2 reading03JSON ocs_data_01_message
attr Talk2 reading03Name LastReceivedMessage
attr Talk2 replacement01Mode reading
attr Talk2 replacement01Regex %%msgid%%
attr Talk2 replacement01Value LastReceivedMessageID
attr Talk2 requestHeader1 Content-Type: application/json
attr Talk2 requestHeader2 Accept: application/json
attr Talk2 requestHeader3 OCS-APIRequest: true
attr Talk2 showError 1


Meine Fragen:

  • Gibt es eine andere (bessere) Möglichkeit, als alle 10 Sekunden abzufragen nach neuen Nachrichten? Ziel soll sein, dass FHEM so schnell wie möglich auf Befehle reagiert - im worst case sind nun ja 10 Sekunden Verzögerung?
  • Das Abrufen alle 10 Sekunden bewirkt, dass die Readings auch alle 10 Sekunden einen neuen Zeitstempel bekommen und dann jeweils erneut ein Event getriggert wird. Wie kann ich das Verhindern, wenn es eben keine neue Nachricht gibt? Also pro Nachricht nur ein Event triggern?
  • Da dies mein erster Kontakt mit HTTPMOD ist, gibt es sonst noch Tipps und Tricks die man beachten sollte? Verbesserungen?

Danke!

kamp

Ich sehe, die Antworten zu HTTPMOD sprudeln generell nicht sonderlich im Forum - ist das zu kompliziert, oder wird es zu wenig verwendet? Gibt es bessere Alternativen um soetwas zu lösen?

Ich bin ein Stückchen weiter (denke ich). Ich habe den Zeitraum auf 5 Sekunden gestellt und ein Timeout von 600 definiert, jetzt kommt mir vor, arbeitet er eines nach dem anderen brav ab und wartet dann immer 600 Sekunden auf neue Nachrichten, wenn er alle abgearbeitet hat, korrekt?

Ein weiteres Problem habe ich identifiziert, bei Systemnachrichten ist im JSON "data" leer und er bleibt da hängen und neuere Nachrichten werden nicht mehr verarbeitet. Dazu habe ich nun "showMatched" gesetzt und gehe mit einem Userreading nun bei der MessageID um einen Zähler hoch, damit er diese überspringt, wenn "data" leer ist. Jetzt habe ich aber das Folgeproblem, dass er wenn er die letzte Nachricht ausgelesen hat, er wieder von vorne beginnt in der History und alle Nachrichten nochmals ausliest - das ist natürlich Mist. Wie kann ich das denn verhindern, jemand eine Idee, Tipp etc?

defmod Talk2 HTTPMOD https://bot:password@cloud.deine.url/ocs/v2.php/apps/spreed/api/v1/chat/bparuvcs?lookIntoFuture=1&limit=1&lastKnownMessageId=%%msgid%% 5
attr Talk2 enableControlSet 1
attr Talk2 enableCookies 1
attr Talk2 reading01JSON ocs_data_01_id
attr Talk2 reading01Name LastReceivedMessageID
attr Talk2 reading02JSON ocs_data_01_actorId
attr Talk2 reading02Name LastReceivedSender
attr Talk2 reading03JSON ocs_data_01_message
attr Talk2 reading03Name LastReceivedMessage
attr Talk2 replacement01Mode reading
attr Talk2 replacement01Regex %%msgid%%
attr Talk2 replacement01Value NextMessageID
attr Talk2 requestHeader1 Content-Type: application/json
attr Talk2 requestHeader2 Accept: application/json
attr Talk2 requestHeader3 OCS-APIRequest: true
attr Talk2 showError 1
attr Talk2 showMatched 1
attr Talk2 timeout 600
attr Talk2 userReadings NextMessageID { (ReadingsVal("Talk2","MATCHED_READINGS","") eq "" ? ReadingsVal("Talk2","LastReceivedMessageID",0)+1 : ReadingsVal("Talk2","LastReceivedMessageID",0)) }

kamp

Mangels Reaktionen eine einfache Frage: wird HTTPMOD überhaupt noch aktiv verwendet, oder ist es als obsolet zu betrachten?

Beta-User

Hmm, würde eher darauf tippen, dass dein Anwendungsfall etwas exotisch ist (und ggf. ein eigenes Modul dafür besser wäre).

HTTPMOD ist jedenfalls aktiv gepflegt :) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

jhohmann

Und wenn du noch event-on-change-reading passend pflegst, kommen auch nur dann Events, wenn sich die Inhalte ändern.
Und wenn du auch die Timestamps behalten willst, kommt noch Timestamp-on-change-reading dazu.
Raspberry Pi 4 - bookworm / EnOcean - Rollo+Licht, deCONZ - Licht+Sensoren, ZWave - CO Messung, HMCCU mit piVCCU - Heizung+Rollo
plus dovecot, minidlna

kamp

#5
komme erst jetzt wieder dazu mich darum zu kümmern. Nunja, es mag speziell sein, aber der grundlegende Usecase ist doch nicht so abwägig. Man will keine Fremd-Messenger nutzen (Whatsapp, Telegram etc) und möchte die eigene Cloud für das verwenden. Leider bin ich absolut kein Perl-Profi und ein eigenes Modul zu schreiben scheidet daher mal aus. Der Initialaufwand, um zu verstehen wie man ein Modul baut, ist mir selbst als Programmierer zu hoch (neben dem fehlenden Perl-Wissen). Das würde Wochen in Anspruch nehmen, die ich nicht habe.

Wie genau meinst du kann ich mit event-on-change-reading die beschriebenen Fehlverhalten vermeiden? Wenn er bei jedem Auslesen die nächste Nachricht nimmt, ändert sich der Inhalt ja und der beschriebene Loop besteht weiterhin. Ich habe einige selbstgeschriebene APIs (PHP/JSON) mit HTTPMOD im Einsatz und die laufen einwandfrei, aber hier komme ich einfach nicht wirklich weiter...

Beta-User

Glaube nicht, dass das mit dem eigenen Modul abwegig ist oder zu lange dauert.

Wirf mal einen intensiveren Blick auf meine Fassung von TvHeadend (hier aus dem forum), das könnte vielleicht ein relativ einfach anzupassender Rahmen sein?
(Ist gepackaged, so dass man nur an sehr wenigen Stellen was anpassen muss, um es unter anderem Namen zum laufen zu bringen. JSON-decoding der asynchronen Abfragen ist auch drin....)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

kamp

Danke, habe ich mir gerade angesehen. Mangels Perl-Kenntnissen für mich kein gangbarer Weg. Ich müsste mich da sehr intensiv in Perl einarbeiten, zumal die Funktionsweise von Modulen in FHEM verstehen lernen, diesen Aufwand möchte ich nicht investieren. Gäbe es das z.B. in C# hätte ich es schon umgesetzt.

Ich habe aus Spaß wieder das HTTPMOD aus dem ersten Posting erstellt in meiner Prod-Instanz und das Problem mit den immer wieder auslösenden Events hat sich erledigt. Da hat sich wohl in der Zwischenzeit in der Nextcloud-Talk API etwas geändert. Daher werde ich mich nun an ein Notify mit 99-Utils.pm machen und mal schauen ob ich so mit dem Bot interagieren kann.

Beta-User

OK, dann mal viel Erfolg.

Mal sehen, nextcloud steht als Stichwort für meinen nächsten Server eh' auf dem Zettel; von daher kann es sein, dass mich das Thema dann ausgangs des Jahres selbst interessiert...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

JensS

#9
Danke @kamp für die Vorlage - habe den Code etwas erweitert und das ist dabei rausgekommen. Mit HTTPMOD kann man schon mal empfangen und senden, sowie empfangene Nachrichten auswerten.
define NextCloudTalk HTTPMOD https://nextuser:next-cloud-API-passwd@meineurl.de/ocs/v2.php/apps/spreed/api/v1/chat/edn6p4n3?lookIntoFuture=1&timeout=59&limit=1&lastKnownMessageId=%%msgid%% 60
attr NextCloudTalk disable 0
attr NextCloudTalk enableControlSet 1
attr NextCloudTalk enableCookies 1
attr NextCloudTalk reading01JSON ocs_data_01_id
attr NextCloudTalk reading01Name LastReceivedMessageID
attr NextCloudTalk reading02JSON ocs_data_01_actorId
attr NextCloudTalk reading02Name LastReceivedSender
attr NextCloudTalk reading03JSON ocs_data_01_message
attr NextCloudTalk reading03Name LastReceivedMessage
attr NextCloudTalk replacement01Mode reading
attr NextCloudTalk replacement01Regex %%msgid%%
attr NextCloudTalk replacement01Value LastReceivedMessageID
attr NextCloudTalk requestHeader1 Content-Type: application/json
attr NextCloudTalk requestHeader2 Accept: application/json
attr NextCloudTalk requestHeader3 OCS-APIRequest: true
attr NextCloudTalk set01Data {"token":"edn6p4n3", "message":"$val"}
attr NextCloudTalk set01TextArg 1
attr NextCloudTalk set01Name send
attr NextCloudTalk set01URL https://nextuser:next-cloud-API-passwd@meineurl.de/ocs/v2.php/apps/spreed/api/v1/chat/edn6p4n3
attr NextCloudTalk setHeader1 Content-Type: application/json
attr NextCloudTalk setHeader2 Accept: application/json
attr NextCloudTalk setHeader3 OCS-APIRequest: true
attr NextCloudTalk showError 1
attr NextCloudTalk timeout 60
attr NextCloudTalk reading01Name LastReceivedMessageID
attr NextCloudTalk extractAllJSON 1
attr NextCloudTalk stateFormat {if (ReadingsVal($name,"ocs_data_01_message","Fehler") eq '{file}'){return '<a href="'.ReadingsVal($name,"ocs_data_01_messageParameters_file_link","Fehler").'" target="_blank">'.ReadingsVal($name,"ocs_data_01_messageParameters_file_name","Fehler").'</a>'}else{return ReadingsVal($name,"ocs_data_01_message","Fehler")}}
Kann in HTTPMOD dem Attribut set01Data der Wert dynamisch übergeben werden oder gibt es eine andere Möglichkeit, die zu sendenen POST-Daten zu übergeben?

Gruß Jens

p.s. Funktioniert jetzt mit "set NextCloudTalk send Text". Durch "lookIntoFuture=1" bleibt die Session für "timeout=59"  Sekunden offen und Nachrichten können sofort empfangen werden.

Fertig ist die NextCloudTalk-Textschnittstelle.  :)

Info: App-Kennwort erstellen https://www.home-assistant.io/integrations/nextcloud/#configuration

Token ermitteln: Du darfst diesen Dateianhang nicht ansehen.

Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

JensS

@alle

Ist ein Nextcloud-Modul in Planung oder in Arbeit?
Andernfalls würde mein voriges Post als Codeschnipsel zur Verfügung stellen.

Gruß Jens
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

betateilchen

Um mal auf die eingangs gestellten Fragen zurückzukommen (auch wenn das über ein Jahr her ist):

Hätte man diese Diskussion im richtigen Forum zu HTTPMOD gestartet anstatt in den Anfängerfragen, wären vermutlich seinerzeit schon mehr Antworten gekommen.

Auch jetzt halte ich es für blanken Unsinn, die Diskussion in den Anfängerfragen weiterzuführen. Mit Anfängerfragen hat das nichts zu tun.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

JensS

#12
Zitat von: betateilchen am 29 Juli 2023, 09:26:20Um mal auf die eingangs gestellten Fragen zurückzukommen (auch wenn das über ein Jahr her ist):

Hätte man diese Diskussion im richtigen Forum zu HTTPMOD gestartet anstatt in den Anfängerfragen, wären vermutlich seinerzeit schon mehr Antworten gekommen.

Auch jetzt halte ich es für blanken Unsinn, die Diskussion in den Anfängerfragen weiterzuführen. Mit Anfängerfragen hat das nichts zu tun.
thx https://forum.fhem.de/index.php?topic=134438.0

p.s. Der Codeschnipsel ist hier zu finden.
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

patator

Vielen Dank für das Codeschnipsel.
Ist es vielleicht jemanden schon gelungen das ganze um einen Set Command zu erweitern um Bilder in einen Chat zu laden?
VG Patrick

JensS

#14
Dazu wird ein set nicht ausreichen.

Zuerst muss die Datei mit Nextcloud-WebDAV zum Nextcloudserver hochgeladen werden. https://docs.nextcloud.com/server/latest/developer_manual/client_apis/WebDAV/chunking.html#starting-a-chunked-upload

Kleine Dateien können einfacher hochgeladen werden. https://docs.nextcloud.com/server/latest/developer_manual/client_apis/WebDAV/bulkupload.html

Dann kann man mit Nextcloud Talk eine Nachricht mit einem Link zur Datei inkl. Freigabe senden. https://nextcloud-talk.readthedocs.io/en/stable/chat/#share-a-file-to-the-chat

Aufgrund der vielen Parameter, die jeweils mitgesandt werden müssen, ist eine Bilduploadfunktion recht aufwendig. Also viel Spass dabei - vielleicht hat jemand Lust, das umzusetzen.  ;)

Gruß Jens
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.