Beiträge von towiat

VPN/Proxy erkannt

Es scheint, dass Sie einen VPN- oder Proxy-Dienst verwenden. Bitte beachten Sie, dass die Nutzung eines solchen Dienstes die Funktionalität dieser Webseite einschränken kann.

    Dann hätte ich nur noch wie ich Kontakte hinzufügen kann bei Telegramm

    Das ist nicht schwierig - öffne die Gruppe und tippe ganz oben auf den Namen der Gruppe. Du findest eine Liste der Gruppenmitglieder und den Menüpunkt "Mitglieder hinzufügen". Um ein Mitglied zu entfernen, machst du einen long tap auf das Mitglied und wählst dann im Menü "Aus der Gruppe entfernen" an.

    Bevor du die folgenden Schritte ausführst, stell bitte sicher, dass der von dir erstellte Bot und mindestens eine andere Person Mitglieder in der Gruppe sind (den Bot musst du über die Suchfunktion lokalisieren, weil er nicht in der Kontaktliste aufscheint).

    Wir sind fast am Ziel, aber eine Hürde muss noch genommen werden. Im Moment sind die Nachrichten des Bot nur für dich sichtbar, weil sie mit deiner ChatID verschickt werden. Damit auch die anderen Gruppenmitglieder die Nachrichten sehen können, müssen sie mit der ChatID der Gruppe verschickt werden.

    Das Herausfinden der Gruppen-ChatID ist etwas umständlich, aber mit den folgenden Schritten machbar:

    1. Schreibe die Nachricht "Test" in die Gruppe
    2. Gib in der Adresszeile des Browser die folgende URL mit deinem Bot-Token ein:
      https://api.telegram.org/bot<BOT_TOKEN>/getUpdates

    Du bekommst eine Übersicht aller Nachrichten, die der Bot erhalten hat. Eine dieser Nachrichten ist die soeben gesendete "Test" Nachricht und diese Nachricht enthält die ChatID der Gruppe (Gruppen-ChatIDs haben ein Minus vorangestellt):

    Der Inhalt kann nicht angezeigt werden, da Sie keine Berechtigung haben, diesen Inhalt zu sehen.

    Und jetzt kannst du den finalen Test machen - rufe erneut die URL zum Nachrichtenversand auf und verwende diesmal die Gruppen-ChatID (inklusive des vorangestellten Minus) statt deiner eigenen:

    Code
    https://api.telegram.org/bot<BOT_TOKEN>/sendMessage?chat_id=<CHATID>&text=Hallo

    Dieses "Hallo" sollte jetzt in der Gruppe erscheinen und für alle sichtbar sein - wenn das der Fall ist, haben wir's geschafft...

    gexle

    Der BotFather ist nur das Verwaltungstool für deine Bots und du wirst nach dem erfolgreichen Setup nicht viel mit ihm zu tun haben.

    Um den von dir erstellen Bot zu sehen, musst du ihn in deine Kontakte aufnehmen:

    • Gehe zu "Kontakte" und gib in der Suche den Namen deines Bots ein
    • Wähle ihn aus und klicke auf "Start" unten am Bildschirm
    • Damit solltest du den Bot in der Liste deiner Kontakte haben

    Jetzt können wir eine Testnachricht an den Bot schicken. Am besten geht das, indem du in der Adressleiste des Browsers die folgende URL eingibst:

    Code
    https://api.telegram.org/bot<BOT_TOKEN>/sendMessage?chat_id=<CHATID>&text=Hallo

    Ersetze <BOT_TOKEN> durch deinen API Token (das ist, wie du richtig gesehen hast, die Zeichenfolge mit Zahl/Doppelpunkt/Buchstaben) und <CHAT_ID> mit deiner persönlichen ID.

    Sobald du diese URL aufrufst, solltest du im Bot die Nachricht "Hallo" sehen.

    Nur das ich das nochmals richtig verstehe ich erstelle mir dann eine Gruppe und dann bekommen alle die in der Gruppe nicht eine Push Nachricht und gut oder.

    Ich bin sozusagen der Gruppen Admin mehr oder weniger?

    Genau - wie bei einer WhatsApp-Gruppe bekommen alle Gruppenmitglieder eine Benachrichtigung, wenn eine neue Nachricht in der Gruppe gepostet wird (sei es vom Bot oder von einem anderen Gruppenmitglied). Und du als Gruppenersteller bist der Administrator und kannst nach Belieben Mitglieder aufnehmen oder rausschmeißen.

    Boa ich dachte das ist einfacher...

    Im Endeffekt brauchst du einen Kommunikationskanal, der mehrere Empfänger erreichen kann und jede Lösung für dieses Problem erfordert Konfigurationsaufwand. Die einfachste Möglichkeit wäre wahrscheinlich immer noch die mehrmals erwähnte Email-Weiterleitung, die für GMX z. B. hier beschrieben ist.

    Ich verwende callmebot.com nicht, weil es für Telegram technisch nicht notwendig ist (wenn man tief genug in der Materie drin ist), aber es bietet eine interessante Funktion, die das vorliegende Problem relativ einfach lösen könnte: die Möglichkeit, Nachrichten direkt an eine Telegram-Gruppe zu schicken.

    Telegram-Gruppen funktionieren de facto genau so wie WhatsApp-Gruppen. Du könntest also Folgendes tun:

    • Du setzt, wie in der callmebot-Anleitung beschrieben, eine Telegram-Gruppe auf, in der der callmebot-Bot Mitglied ist
    • Du fügst alle gewünschten Nachrichtenempfänger zu dieser Gruppe hinzu
    • Die vom callmebot-Bot versendeten Nachrichten sind für alle Gruppenmitglieder sichtbar
    • Den Empfängerkreis kannst du jederzeit direkt in der Telegram-Gruppe durch Hinzufügen/Entfernen von Benutzern anpassen

    Das scheint mir sowohl vom Setup als auch von der laufenden Betreuung her ein einfacherer Weg zu sein, als das direkte Erstellen eines Bots (für den man, wie ich inzwischen festgestellt habe, auch eine Telegram-Gruppe erstellen müsste, um die Nachrichten an mehrere Benutzer zu verteilen).

    Nachdem ich Telegram-Benachrichtigungen schon seit langem verwende und auch in meinem Preissteuerungsscript einsetze, mache ich hier mal den ChatGPT-Ersatz und beschreibe das Prozedere:

    Für den automatisierten Versand von Telegram-Nachrichten benötigt man zwei Dinge:

    1. Einen Bot-Token
      Automatisierte Benachrichtigungen können nicht direkt an Benutzer, sondern nur an Bots geschickt werden. Benutzer, die an diesen Nachrichten Interesse haben, müssen den entsprechenden Bot abonnieren.

      Die Erstellung eines Bots ist jederzeit direkt in der Telegram-App möglich. Dazu muss man mit einem Bot kommunizieren, der den sinnigen Namen @Botfather trägt (und leicht über die Suche in der App gefunden werden kann). Eine Schritt-für-Schritt Anleitung ist z. B. hier zu finden.

      Im Zuge dieses Ablaufs erhält man den Bot-Token, den man tunlichst speichern/notieren sollte.
    2. Die ChatID
      Jeder Telegram-Benutzer bekommt eine eindeutige ChatID zugeordnet. Diese ID muss beim automatisierten Nachrichtenversand angegeben werden, um den Absender zu identifizieren.

      Die ChatID erfährt man am einfachsten, indem man einen weiteren Bot namens @RawDataBot anspricht. Dieser Bot zeigt die ChatID sofort nach Beginn der Konversation an.

    Und das war's - mit diesen beiden Datenpunkten kann man Nachrichten an den Bot schicken. In der einfachsten Form geht das, indem Bot-Token und ChatID in die folgende URL einfügt werden (die spitzen Klammern sind zu entfernen),, die dann direkt im Browser oder über curl aufgerufen werden kann.

    Code
    https://api.telegram.org/bot<BOT-TOKEN>/sendMessage?chat_id=<CHATID>&text=Hallo

    In in diesem Fall wird ein HTTP GET Request verschickt - die Nachrichtenlänge ist sehr begrenzt und die notwendige URL-Codierung der Sonderzeichen macht das schnell unhandlich. Bei komplexeren Nachrichten ist daher ein HTTP POST Request geeigneter:

    Code
    curl -X POST "https://api.telegram.org/bot<BOT-TOKEN>/sendMessage" -H 'Content-Type: application/json' -d '{"chat_id": <CHATID>, "text": "Hello from curl" }'

    Die entsprechende Funktion in einem Shelly-Script könnte z. B. so aussehen:

    Und das ist es auch schon - generell ein ziemlich praktisches Werkzeug, wie ich finde...

    Gibts da eine elegantere Lösung mit den Shelly Calls?

    Ja, laut Doku gibt es die (ich kann's mangels Hardware nicht testen) - man kann Virtual Components direkt mit der setValue() Funktion ändern und muss nicht über Shelly.Call gehen. Beispiel aus der Doku:

    JavaScript
    let a_number = Virtual.getHandle("number:200");
    let some_text = Virtual.getHandle("text:200");
    
    a_number.setValue(42);
    some_text.setValue("Hello World!");

    Damit solltest du die Virtual Components in einem Rutsch updaten können und musst dir keine Sorgen über das RPC Limit machen. Hier noch ein Direktlink zum entsprechenden Kapitel: Virtual Component APIs.

    Ein direkter Emailversand aus einem Shelly Script ist unmöglich, weil der Shelly einfach keinen Email-Client hat.

    Man könnte, wie schon erwähnt, über die Shelly Cloud eine Email an eine Adresse schicken, auf der Weiterleitungsregeln hinterlegt sind.

    Eine Alternative für Benachrichtigungen wäre Telegram. Dazu müsste man einen Telegram-Bot einrichten und alle Empfänger müssten Telegram installieren und diesen Bot abonnieren. Der Versand der Nachrichten aus einem Script heraus ist dann ein einfacher Aufruf des Telegram-APIs.

    Könnte auch mal einer meine KIs loben! Leute das ist die Zukunft - ob ihr wollt oder nicht. Die KIs coden - aber die Anweisungen gebe ich, die Kreativität habe ich, den Überblick habe ich, den Anwendungsbezug habe ich, die praktische ERFAHRUNG habe ich.

    Die KI hat dir zuerst eine falsche Information über Switch.Set gegeben und dich dann dazu überredet, eine nicht existierende Funktion aufzurufen - und du hattest eindeutig nicht die Kompetenz, das zu erkennen. Ich möchte gar nicht wissen, wie deine 2000 Codezeilen aussehen (und ich bin selbst Softwareentwickler und verwende auch KI)...

    Zunächst haben wir den (alten) Shelly-Befehl "Switch.Set" mit diversen Callback-Varianten versucht. Da die aktuelle API (siehe https://shelly-api-docs.shelly.cloud/gen2/) jedoch „Relay.SetState“ vorsieht, haben wir den Aufruf umgestellt und als Parameter { id: 0, state: "on" } bzw. { id: 0, state: "off" } übergeben.

    Das verwirrt mich hochgradig - wo hast du die Information her, dass Switch.Set veraltet sein soll? Und wo kommt Relay.SetState her? Laut der (auch von dir verlinkten) Shelly-Doku gibt es keine Relay Komponente und konsequenterweise auch keine RPCs dafür.

    Laut Dokumentation hat der Shelly Plus Uni zwei Instanzen der Komponente Switch, und die müssen natürlich auch über Switch.Set mit ID 0 bzw. 1 ansprechbar sein.

    Wenn du dir die verfügbaren RPCs mit http://<ip>/rpc/Shelly.ListMethods anzeigen lässt, findest du dann tatsächlich einen Relay.SetState, aber keinen Switch.Set vor?

    Dann "sieht" man da drin Dinge, die man dem konkreten aktuellen Problem zuordnet, obwohl das auch im Gut-Fall genauso ausschaut - und schon ist man falsch abgebogen.

    Eigentlich hab ich weder was gesehen noch zugeordnet und ich bin auch nirgendwo abgebogen. Ich wollte nur freundlich sein und euch einen Datenpunkt zur Verfügung stellen, der unter Umständen hilfreicher sein könnte als die Angabe meines Internetproviders, der offensichtlicherweise nichts mit dem Problem zu tun hatte...

    Keine Ahnung ob's euch hilft, aber hier ist ein (gekürzter) Traceroute von meiner Location - die Zeitüberschreitung tritt immer an der gleichen Stelle auf:

    Code
      6    21 ms    21 ms    20 ms  core11.nbg1.hetzner.com [213.239.237.210]
      7    27 ms    27 ms    26 ms  core21.fsn1.hetzner.com [213.239.254.205]
      8    27 ms    26 ms    26 ms  spine16.cloud2.fsn1.hetzner.com [213.239.227.209]
      9    27 ms    26 ms    28 ms  spine13.cloud2.fsn1.hetzner.com [78.47.9.198]
     10     *        *        *     Zeitüberschreitung der Anforderung.
     11    28 ms    27 ms    26 ms  30830.your-cloud.host [138.199.178.204]
     12    26 ms    34 ms    25 ms  shelly-forum.com [188.245.115.65]

    Na dann schmeiß ich auch noch eine Alternative rein. Das folgende Script kann alle KVS-Einträge in einem Rutsch löschen.

    • Zuerst werden mit KVS.List alle KVS-Keys extrahiert und in einem Array gespeichert
    • Dann wird jeder Key einzeln aus dem Array entnommen und gelöscht, wobei die Aufrufe von KVS.Delete mit Einmaltimern verkettet sind
    • Das bewirkt, dass jeder Löschvorgang erst dann stattfindet, wenn der vorhergehende erfolgreich abgearbeitet wurde
    • Der Vorgang ist beendet, wenn der Array leer ist (was bedeutet, dass alle Keys gelöscht wurden)

    Durch diese Technik werden die Löschungen schön sauber aneinander gereiht und es gibt keine Probleme mit dem RPC-Limit.

    Die originale Dokumentation von Shelly.getComponentStatus() kommt auch ohne "Call" aus.

    Ja, es ist ja völlig eindeutig. Wenn man die von Shelly selbst veröffentlichten Beispielscripte auf GitHub durchsucht, findet man 15 Aufrufe von Shelly.getComponentStatus - und jeder einzelne davon ist synchron, weil es nun einmal eine synchrone Funktion ist.

    Die Antwort vom Support hat halt schon eine starken KI-Geruch. Vermutlich gibt es viele Anfragen zum Thema Asynchronität und da ist es schon plausibel, dass eine KI die vorliegende Frage in den falschen Hals kriegt und KI-typisch noch ein bisschen dazuhalluziniert (und eine kontrollierende Supportperson bräuchte fortgeschrittene Scriptingkenntnisse, um das Problem mit der Antwort zu erkennen).

    Falls sich hier tatsächlich eine KI verirrt hat, wäre das auch ein schönes Beispiel dafür, wie eine Support-KI gleich doppelt Schaden anrichten kann. Nicht nur wird ein Kunde mit einer falschen Antwort abgekanzelt - auch das zuständige Produktteam erfährt damit nichts von einem (mit hoher Wahrscheinlichkeit) realen Problem mit dem Produkt.

    Du hast natürlich recht und das ist jetzt keine Meisterleistung vom Support.

    In Ihrem Skript versuchen Sie, das Ergebnis eines asynchronen Aufrufs (Shelly.getComponentStatus) synchron zu verarbeiten

    Das ist in aller Eindeutigkeit falsch. Shelly.getComponentStatus IST ein synchroner Aufruf und muss selbstverständlich auch als solcher verarbeitet werden.

    Dies ist jedoch in der Regel nicht möglich und führt zur bekannten Fehlermeldung „Too many scopes removed“.

    Auch das ist falsch. Die Meldung "Too many scopes removed" habe ich noch nie gesehen und diese Meldung taucht auch dann nicht auf, wenn man einen asynchronen Call falsch abarbeitet (und Google findet für diese Meldung - abgesehen von diesem Thread - keinen einzigen Treffer).

    Ich weiß nicht, wie man da noch einmal nachgreifen könnte, aber das ist schon sehr unbefriedigend...

    Meiner Meinung nach ist das ein Fall für ein Ticket an den Support. Sämtliche Beispiele von dir sind völlig in Ordnung und sollten problemlos funktionieren.

    Spekulation:

    In Firmware 1.5 wurde das Verhalten von let (und const) geändert. Variablen, die mit diesen beiden Keywords definiert werden beachten jetzt den Scope, in dem sie angelegt wurden (und Shelly-Javascript verhält sich damit jetzt in dieser Beziehung wie 'normales' JavaScript).

    Für mich sieht es so aus, als ob sich der Interpreter verläuft, wenn let verwendet wird und Sensoren im Spiel sind. Möglicherweise hat die erwähnte Änderung da nicht ganz geklappt.

    Du könntest das noch testen, indem du die Variablen mit var anstatt mit let definierst. Aber wie gesagt, für mich ist das eindeutig ein Problem auf der Shelly-Seite.