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.

    Ich hatte immer mal wieder das Gefühl bzw. festgestellt das es sich nicht ganz an die Zeiten hält. Bei mir soll es von 5-22 Uhr zu den billigen Stunden ein Geräte 7 Stunden einschalten. Wenn ich das Kontrolliert habe, wurde teilweise schon eine Stunde zu früh eingeschaltet. Ich habe aber nie kontrolliert, ob und nach welchen Strompreisen das Skript arbeitet.

    Danke - sehr interessant. Aufgrund der internen Logik würde ich das im ersten Moment als unmöglich einstufen, aber es wäre nicht das erste Mal, dass mich mein eigener Code überrascht...

    Ich lasse mal Version 3.0 und 3.1 mit dem beschriebenen Setup für ein paar Tage laufen und beobachte das Schaltverhalten.

    Nur zur Sicherheit: die Zeitzoneneinstellung auf deinem Shelly ist korrekt?

    Ich habe Version 3.1 des Scriptes veröffentlicht. Dies ist ein Service-Release ohne funktionale Änderungen. Das Changelog enthält zwei Punkte:

    • Behoben: Umgang mit Zeitumstellung
      Aufgrund von Einschränkungen der Shelly-Zeitberechnungs-Routinen hätte das Script an den Tagen der Zeitumstellung auf/von Sommerzeit die Synchronität mit dem Kalender verloren. Dies ist mit dieser Version behoben.
    • Geändert: Optimierungen
      Aufgrund eines verbesserten Speichermodells und allgemeiner Code-Optimierungen verwendet das Skript nun weniger Speicher. Der Spitzenverbrauch hat sich von ~9,5 kB auf ~7,2 kB in der speicheraufwändigsten Konfiguration reduziert.

    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.