Beiträge von eiche

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 halte Pascal für eine sehr gute Lern-Programmiersprache, wozu sie auch afaik von Niklas Wirth gedacht war. Immerhin lernte ich an Hand von Borland Pascal die ersten Dinge der OOP und verstand sie auf Grund der sehr guten Borland Bücher sogar. Das bot mir dann die Grundlage zum verstehen der OOP in C++ - meiner Ansicht nach noch immer die herausstechendste Sprache, wenn man sorgfältig damit codet. DAC sicher ist sie allerdings nicht.

    DAC ist meine ad hoc Schöpfung für Dümmster anzunehmender Coder. ;)

    Ich hätte mir früher aber auch nicht gedacht, dass ich mich mal mit JavaScript anfreunden täte. Aber die Aspekte der Programmiererei haben sich stark ausdehnend weiterentwickelt. Ich denke bspw. an das JSON Format.

    Und ja, Blockly fand ich zunächst interessant (für Anfänger). Als ich dann damit experimentierte, fand ich es für mich ... hm, wenig zielführend.

    Als Lernhilfsmittel ist Blockly vermutlich nicht schlecht, aus meiner Sicht als ausgedienter Lehrer. Ich habe aber bereits Erfahrung mit bspw. "Robot Karol" zwecks motivierendem Einstieg in's Programmieren/Coden gesammelt - und musste registrieren, dass die wenigsten meines Clientels die dort erworbenen Fähigkeiten auf eine ernsthafte Programmiersprache (hier; C unter C++) mitnahmen.

    Somit stimme ich dir, @De kat, zu, was Blockly betrifft.

    Interessant sind auch Vergleiche zwischen Tasmota32 mit Berry und der Shelly Firmware mit JavaScript Möglichkeiten. Beide sind Ereignis gesteuert zu verwenden, hier mit Events, dort mit Rules. Tasmota ist halt auf vielen ESP32 Schaltungen einsetzbar und in vielen Anwendungen nutzbar. Leider gibt es dort die von mir gerne genutzten Schedule Jobs nicht. Ich täte es begrüßen, wenn die Shelly Firmware auch auf sonstigen ESP32 Boards nutzbar wäre.

    Zu diesem, hier eingesetzten Shelly habe ich einen Abschnitt auf meinem Node-RED Dashboard.

    Hier sind die von mir fest vorgesehenen 8 Wochenpläne einseh- und editierbar.

    Diese Wochenpläne sind selbstverständlich auf dem Shelly implementiert - als Schedule Jobs.

    Das Dashboard stellt nur das Frontend für den Anwender bereit.

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

    Das liefert ein Raspberry Pi 4.

    Ich bin skeptisch, ob ich dieses auch in einem Shelly Skript zur Verfügung stellen könnte. Vielleicht werde ich es gelegentlich versuchen. Das dürfte, wenn es gelingen sollte, aber hart an die Grenze des Machbaren gehen.

    @De kat

    Ich habe den Härtetest wie folgt durchgeführt und will es noch einmal tun.

    Über ca. 1 Stunde habe ich drei Endgeräte, 2 PC Web Browser und ein Smartphone, im 1s Refreshing laufen lassen. Es ergaben sich in dieser Zeit keine Probleme.

    Ja, ich bin davon weitgehend überzeugt, dass das Skript stabil läuft.

    Edit:

    Das Skript tut ja mehr als nur die Webseite liefern und die Interaktion mit dem Browser betreiben.

    Es regelt die Temperatur per Ventil-Stellantrieb, es kommuniziert per MQTT und es reagiert in Abständen von einer Minute auf Schedule Jobs oder solchen, die per Wochenpläne die Zieltemperatur ändern - letztere allerdings selten.

    Edit 2:

    Auszug aus Shelly.GetStatus:

    "ram_size": 245760,

    "ram_free": 130972,

    "fs_size": 458752,

    "fs_free": 122880,

    Da sollte noch etwas gehen. ;)

    Hier noch die erheblich bessere Variante zu obigem Skript.

    Sie ist besser, weil per Werte am Skriptanfang die gewünschten Dinge festgelegt und so leicht änderbar sind und weil man für eine Änderung jeweils nur an einer einzigen Stelle die Änderung vorzunehmen braucht.

    Außerdem ist das die Vorstufe zu einer Konfiguration außerhalb des Skripts im KVS.

    Man kann selbstverständlich die MQTT Payload komplexer gestalten, bspw. um die Ausgangs-Id erweitern.

    {"out":1, "schalte":"ein", "dauer":300} täte den Ausgang 1 für 5 Minuten einschalten.

    Hierfür müsste aber action() noch angepasst werden.

    Ich empfehle hierfür ein kurzes Skript, weil du damit das Topic selbst frei festlegen kannst. Das ergibt sich aus der Dokumentation.

    1. https://shelly-api-docs.shelly.cloud/gen2/General/RPCProtocol - zu RPC (Remote Procedure Call)
    2. https://shelly-api-docs.shelly.cloud/gen2/Scripts/S…es#mqtt-support - zu MQTT im Skript
    3. https://shelly-api-docs.shelly.cloud/gen2/ComponentsAndServices/Switch - zum schalten des Ausgangs
    4. https://shelly-api-docs.shelly.cloud/gen2/Scripts/S…ures#shellycall - zur RPC Nutzung im Skript
    5. https://shelly-api-docs.shelly.cloud/gen2/Scripts/S…strings-in-json - zur Nutzung des JSON Formats

    Die Links sollen dir nur den Fokus geben. Die Doku ist sehr gut, aber auch umfangreich und nicht immer leicht verständlich. ;)

    Wenn du dir diese Doku nicht antun willst, nimm einfach das folgende Skript, baue es ein und stelle es auf automatischen Start (enable).

    Das kleine passende Skript hierzu - getestet mit Firmware 1.1.0-beta2. Firmware 1.0.8 machte bei MQTT.subscribe() merkwürdige Probleme.

    Man kann mehr Parameter nutzen, die aber hier nicht notwendig sind.

    Der Code geht besser, aber dann wird er für Anfänger schwerer verständlich.

    Code
    function action(topic, payload) {
      print(payload);
      let p = JSON.parse(payload); // liefert die payload Struktur als Objekt
      if(p.schalte!=="ein" && p.schalte!=="aus") return; // ein oder aus sind die akzeptierten Schaltwörter
      if(p.dauer===undefined) Shelly.call("Switch.Set", {id:1, on:p.schalte==="ein"});
      else Shelly.call("Switch.Set", {id:1, on:p.schalte==="ein", toggle_after:p.dauer});
    }
    
    MQTT.subscribe("dein/eigenes/topic", action);

    Die Funktion action führt das aus, was du willst.

    MQTT: Topic = "dein/eigenes/topic", Payload = {"schalte":"ein" bzw. "aus", optional "dauer":Sekundenwert}

    Hiermit kannst du dein gewünschtes Topic im Aufruf von MQTT.subscribe() einsetzen.

    Wenn du statt "schalte" mit "ein" bzw. "aus" lieber "on" mit true bzw. false nutzen willst, ist das Skript darauf leicht anpassbar.

    Ich möchte dir bei dieser Gelegenheit auch die Flexibilität per Skript aufzeigen.

    Es geht erheblich besser, wozu aber mehr Aufwand gehört.

    Die ohne Skript verfügbare MQTT-Kommunikation läuft über RPC erheblich anders und gewöhnungsbedürftig ab.

    Deshalb habe ich dir das kleine Skript empfohlen.

    Hinweis: Kopiere nicht per Markierung, Copy & Paste sondern über das Kopiersymbol am Codefenster! Andernfalls erhältst du nicht sichtbare Zeichen, welche die Shelly Firmware nicht verdaut.

    Edit:

    Ich korrigiere. In Firmware 1.0.8 lag mein Problem womöglich darin, dass ich beim aktivieren von MQTT auch ein Pre-Topic festlegen muss - teilweise verständlich.

    Überarbeitung

    Damit nicht unnötige Posts hier erscheinen, habe ich dieses überarbeitet.

    Der Shelly stellt per Skript eine Webseite bereit, die in verschiedenen Modi zyklisch refresht werden kann - oder auch ohne Refresh.

    Zusätzlich ist sie interaktiv. Der Anwender kann die Zieltemperatur um jeweils 0.5°C erhöhen oder absenken.

    Vorteile

    1. Man kann mit dem Shelly auch über dessen Access Point Adresse 192.168.33.1 kommunizieren, wenn man bspw. das Smartphone mit dem Shelly AP gekoppelt hat.
    2. Es sind keine zusätzlichen Kommunikationspartner wie ein übergeordnetes System oder ein MQTT Broker erforderlich.

    Screenshots der Webseite

    Die folgenden Screenshots zeigen die Darstellungen in einem HTML 5 fähigen Web Browser. Sie erscheinen sowohl auf einem PC als auch auf einem Smartphone. Sogar ein relativ einfaches Smartphone aus dem Jahr 2013 kann mit installierten Firefox diese Seite darstellen und automatisch refreshen. Einzig die kleinen Links links und rechts der Zieltemperatur sind mit dem alten Smartphone nicht so leicht zu aktivieren. Mit meinem aktuellen Smartphone geht das leicht.

    Jede Abbildung zeigt einen von vier konfigurierten Refresh Modi. Die aktivierbaren Links sind in gelb dargestellt.

    Es sind vier Zeitangaben (Datum und Uhrzeit) enthalten, die alle lokal auf dem Shelly vorliegen sollten. Daran kann der Anwender erkennen, wie aktuell verschiedene Dinge sind. Derzeit habe ich den Fall "Shelly ist nach reboot offline" noch nicht getestet. Hierfür sind sicher Codeänderungen erforderlich - ein Punkt auf der todo Liste.

    Die Zeitangabe oben, unterhalb des Gerätenamens gibt an, wann die Webseite vom Shelly geliefert wurde.

    Unter "Zieltemperatur" liegt der Zeitpunkt der letzten Änderung.

    Unter "Temperatur" und "Luftfeuchtigkeit" stehen die Zeitpunkte der letzten Wertregistrierung, also wann die Firmware des Shelly diese Werte per Event zur Verfügung stellte.

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

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

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

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

    Code und HTTP Requests

    Statt dieser Refresh-Zyklus-Werte können selbstverständlich auch andere genutzt werden. Sowohl die Namen als auch die Werte liegen in folgendem Datenfeld.

    Code
    Mode = [ // e.g. four refresh modes, you may try one mode ;-P
      {name:"ohne Ladezyklen", value:0}, // without refreshing
      {name:"alle 60s", value:60}, // regular mode
      {name:"per Taster einstellen", value:1}, // adjust mode
      {name:"alle 10s", value:10} // one of possible multiple alternatives
    ]

    Der Modus "per Taster einstellen" bezieht sich auf zwei Taster zum schrittweisen erhöhen bzw. absenken der Zieltemperatur. Diese Taster sind am AddOn angeschlossen, Tastendrücke werden per Skript verarbeitet. Da hierbei kein Display vorliegt, kann bspw. ein Smartphone mit der Shelly Skript-Website genutzt werden. Damit die Anzeige zügig reagiert, wird hier in 1s Abständen refresht.

    Diese Struktur kann selbstverständlich editierbar im KVS abgelegt sein und von dort bei Skriptstart eingelesen werden.

    Der URL hat die folgende Struktur.

    Code
    http://<IP-Adresse des Shelly>/script/<Skript-Id>/data?m=<Modus Index>
    bzw. ohne Wahl des Modus und Verwendung des default Index 0
    http://<IP-Adresse des Shelly>/script/<Skript-Id>/data
    Zum verändern der Zieltemperatur gibt es zwei Alternativen.
    1. http://<IP-Adresse des Shelly>/script/<Skript-Id>/data?s=<neuer Wert>
    2. http://<IP-Adresse des Shelly>/script/<Skript-Id>/data?d=<Schrittwert>

    Der Request-Wert hinter data? kann alternativ drei verschiedene Parameter enthalten.

    1. m=<Refresh Modus als Index zum Datenfeld Mode (s.o.)>
      m=1 lässt die Webseite alle 60s refreshen
    2. s=<neuer Wert für die Zieltemperatur>
      s=12 setzt die Zieltemperatur auf 12°C
    3. d=<Änderung relativ zur vorliegenden Zieltemperatur, auch Vorzeichen behaftet>
      d=-0.5 senkt die Zieltemperatur um 0.5°C

    Der Codeabschnitt zu diesen Webseiten.

    Nochmals vielen Dank für die gute Grundlage, die @De kat zur Verfügung stellte.

    Die Variable Status mit deren Komponenten tT, tC und rh liegen im gesamten Skript an anderer Stelle, dort, wo nicht ganz regelmäßig die gemessenen Werte abgelegt und in regelmäßigen Abständen (Schedule Job) von dort nehmend geliefert werden. Diese werden zusammen mit einem Zeitstempel übertragen und landen in einer Zeitreihendatenbank - aber das ist ein anderes Thema.

    Die CSS-Angaben sind mir nicht sehr vertraut. Ich weiß halt, dass es so etwas gibt und die Struktur kenne ich auch, aber die genauen Bezeichnungen muss ich oft recherchieren und testen.

    So, nun sollte das Projekt vorläufig komplett sein.

    In meinem Projekt "Autarke Heizkreisregelung" per Shelly Plus 1 mit AddOn funktioniert der kleine Webserver im Skript nach Vorlage von @De kat inzwischen bestens.

    Hier mal die vorläufige Darstellung:

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

    Es wird sogar ein 1s Reload Zyklus bewerkstelligt. Dieser sehr kurze Zyklus dient ausschließlich der Rückmeldung einer Zieltemperaturänderung per zwei Mikrotastern am Addon.

    Somit gelingt quasi eine Nachbildung des TRV mit anderen Mitteln und geringerer Ausfallwahrscheinlichkeit.

    Der TRV hat trotzdem noch partiell kleine Vorteile, die ich aber nicht brauche. Zudem werde ich irgendwann einmal den schlichten Regelalgorithmus (Zweipunktregelung) per Puls/Pausenverhältnis etwas verbessern.

    Btw, ein paar wenige CSS Parameter ließen sich auch vom Anwender per KVS konfigurieren. Nur das Design, hier in Tabellenform, bliebe gleich.

    Ich werde gelegentlich versuchen, auf der Webseite per Button die Umschaltung zwischen zwei Modi zu unterstützen. Damit kann der Anwender zwischen "Einstellmodus" mit zügigen Rückmeldungen (1s) und "Regelmodus" (60s) umschalten.

    Wesentlich hierbei ist, dass dazu neben dem Shelly + Zubehör ausschließlich ein Smartphone oder so gebraucht wird. Dabei ist selbstverständlich ungenommen, dass auch ein übergeordnetes System verwendet werden kann, aber eben nicht muss.

    Edit:

    angular.min.js kann wegen zu großen Umfangs nicht auf dem Shelly zur Verfügung gestellt werden. Somit müsste die Einbindung dieser Bibliothek per Verweis auf eine externe Quelle erfolgen, was klar möglich ist, dafür aber das Computernetzwerk nicht ausfallen dürfte.

    Nun ja, zaubern geht halt mit so einem kleinen Shelly nicht. ;)

    @De kat :

    Ich habe soeben mal deinen Shelly Script httpd ausprobiert. :thumbup: :thumbup: :thumbup:

    Sehr sehr chique. Ich werde mal etwas Funktionales testen, mit meinem autarken Shelly Heizkörperregler. ;)

    Auf jeden Fall ist deine Vorlage eine vorzügliche Anregung. Ich bin gespannt, ob damit auch JavaScript mit "angular.min.js" geht. Dann könnte der Shelly eine autarke anwendergerechte Webseite bieten und wäre so nicht nur ziemlich ausfallsicher (wegen Autarkie), sondern böte auch noch ein echtes Dashboard.

    Das wär dann richtig cool. 8)

    Zunächst einmal einen Dank an @De kat.

    Meine Anwendungsumgebung

    Ich habe vor, mehrere Shelly Plus 1 mit AddOn und Temperaturfühler zur autarken Heizkörperregelung einzusetzen. Mein Prototyp arbeitet bereits zur vollen Zufriedenheit. Per Node-RED Dashboard kann ich und insbesondere meine Frau alles anwenderfreundlich einstellen, was das Herz begehrt, auch bspw. Schedule Jobs. ;)

    Zwecks Optimierung der Ausfallsicherheit, will ich den Shelly mit einem Taster ansteuern - langer Druck -> Zieltemperatur erhöhen, kurzer Druck - Zieltemperatur senken.

    Für die aktuellen Daten der Regelung (Zieltemperatur, gemessene Temperatur, Ventil auf/zu) kann das Web UI des Plus 1 nicht verwendet werden, weil hier die Zieltemperatur fehlt. Also will ich eine Webseite per Skript zusammenstellen, die mir diese Daten anzeigt. Hierzu ist im Falle eines Netzwerkausfalls das anzeigende Smartphone per WLAN mit dem AP des Shelly zu koppeln. Leider fand ich bisher keinen Weg, die kryptischen, und damit wenig anwenderfreundlichen, AP-SSID zu ändern.

    Meine Fragen

    1. Gibt es eine Möglichkeit, irgendwie die AP-SSID zu manipulieren, damit diese benutzerfreundlich gestaltet werden kann?
    2. Weiß jemand hier, ob seitens Allterco die Änderbarkeit dieser SSID auf einer todo Liste steht?

    Über konstruktive Reaktionen täte ich mich freuen.

    Anmerkung

    Meine Implementation der Heizkörperregelung arbeitet verlässlicher als dies die TRV tun. Deshalb will ich erstere zukünftig bevorzugen, auch wenn die TRV das Stellventil quantifiziert öffnen können, was mein Stellantrieb nicht kann.

    langerES : Zu den Schedules

    Ich habe mir das an einem Shelly Plus Plug S mit Firmware 1.0.8 mal angesehen. Die Wege sind etwas komplexer geworden, Dafür bietet das Web UI deutlich mehr Möglichkeiten zur Einstellung von Schedule Jobs, die ich nur noch mit einer eigenen Webseite toppen kann. Mir gefallen die neuen Möglichkeiten. Es fehlt allerdings eine Konfigurationsmöglichkeit für weniger ambitionierte Anwender. Ich zeige mal meine Screenshots aus dem Web UI.

    Dazu ist ein Schedule Job auszuwählen (anklicken) oder ein neuer anzulegen.

    Interessanterweise wird beim ansehen eines vorhandenen Schedules der Modus "Advanced schedule" vorausgewählt, beim neu anlegen hingegen "Basic schedule". Dies erscheint mir eher zur Verwirrung beizutragen, auch wenn ich dies keineswegs als Fehler interpretiere.

    1. Die Darstellung im Modus "Advanced schedule" (Titel "Schedule type").
    Die Bezeichnung "Schedule type" halte ich für ungeeignet, weil die zugrunde liegenden Schedule Jobs alle die gleichen Einstellmöglichkeiten bieten. Ausschließlich die Benutzerschnittstellen (hier: im Web UI) unterscheiden sich.

    Hier lassen sich auch erweiterte Einstellungen nutzen, bspw. an einem bestimmten Tag in einem bestimmten Monat.

    .

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

    Unter "When to execute" kannst du in engl. Prosa die Zeiteinstellung lesen. In meinem Fall stimmt allerdings darin die Angabe "At weekday Sonntag" nicht, weil dieser Job für alle Wochentage gilt.

    2. Die Darstellung im Modus "Basic schedule" (Titel "Schedule type").

    Hier lassen sich ausschließlich Wochenpläne ablesen bzw. einstellen.

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

    Vermutlich kommt dir dieser zweite Modus mehr entgegen. Allerdings muss man afaik dies in jedem Schedule Job aktiv selektieren.

    Ich fand leider bisher keine Möglichkeit, diesen Modus als Standard festzulegen.

    Fazit: Die Benutzerfreundlichkeit (usability) kann sicher noch gesteigert werden. Dire neuen Möglichkeiten sind imho aber sehr begrüßenswert.

    Stefanie24

    Deine Anregung passt.

    Das kann man ja leicht bspw. per Web-UI konfigurieren, allerdings habe ich eine solche Kombination aus konfigurierter Einschaltdauer und Skript-Timer bisher nicht getestet.

    Sie müsste aber funktionieren.

    Kleine Korrektur am Rande - in aller Freundschaft: ;)

    man Skripte per html callen

    1. Nicht ein Skript wird aufgerufen (call), sondern ein HTTP Handler, was eine Funktion im Skript ist.
    2. Es wird nicht per HTML sondern per HTTP GET (Adresszeile im Browser) aufgerufen, bzw. im Shelly per action/webhook.

    Ansonsten Danke für dein Interesse.

    Edit: Inzwischen getestet ... und funktioniert wie gewünscht. ;)