Dieser Artikel bezieht sich auf eine Shelly Anwendung zu alten elektrischen Nebenuhren, wie sie noch immer bspw. bei der Bahn eingesetzt sind. Diese werden von einer anzeigelosen Hauptuhr als Taktgeber gesteuert. Die Hauptuhr wird hier durch einen kleinen Shelly ersetzt.

Hier beschreibe ich die Schritte zur Installation meiner Implementation. Ich setze die grundlegensten Kenntnisse zum erstellen und pflegen eines Skripts voraus - Website des Shelly -> Scripts ...

2023-04-15

Im folgenden wird "Uhr" als Synonym für die Anlage verwendet, welche aus dem Shelly, einem Polwenderelais und der Zeitanzeige besteht.

Die aktuelle Version gestattet die Anwendung sowohl im Online als auch im Offline Modus - letzterer auch temporär.

  • Im Online Modus und verfügbarem Zeitserver wird die Uhr automatisch synchronisiert. Hier greift die automatische Synchronisation.
  • Im Offline Modus steht kein Zeitserver zur Verfügung. Hier muss der Anwender bei Bedarf per Eingaben synchronisieren, d.h. die Uhr stellen.

A) Gebraucht werden

  1. ein Shelly Plus 2 oder Pro 2 mit aktueller Firmware,
  2. eine sog. Nebenuhr, welche ausschließlich per regelmäßiger Pulse gesteuert wird,
  3. ein Polwenderelais.

! Es sei ausdrücklich erwähnt, dass hier keine Cloud zum Einsatz kommt. !

Ausgang 1 (switch:0) und Ausgang 2 (switch:1) werden geeignet mit dem Polwenderelais verbunden.
Ausgang 1 liefert kurze Pulse (bspw. 500ms lang) zum weiterrücken der Anzeige.
Ausgang 2 liefert die langen Polwendepulse. Er wird mit jeder fallenden Flanke an Ausgang 1 zum wechseln (toggle) 500ms danach getriggert.
Nach jeder Minute braucht die Uhr zum weiterrücken einen Wechsel der Polarität.

Schaltskizze - O1=Ausgang 1, O2 = Ausgang 2

Schaltskizze

B) Voraussetzungen des Shelly-Gerätes:

  1. Für eine automatische Synchronisation braucht es eine (W)LAN Verbindung und eine Verbindung zu einem Zeitserver.
  2. Es muss passend konfiguriert werden.

C) Die Anwendung besteht aus

  1. einem Skript, an dieser Stelle zu finden,
  2. drei Schedule Jobs - optional einem vierten Job,
  3. einer HTML Datei (kein Webserver erforderlich, Smartphone-Version verfügbar) zum unterstützten konfigurieren,
  4. einer HTML Datei für Endanwender zum stellen der Uhr.

Die HTML Dateien dienen ausschließlich der Kommunikation mit dem Shelly per HTTP GET. Es wird kein sonstiges System benötigt. Wenn die Uhranwendung fertig installiert ist, läuft sie bei automatischer Sychronisation normalerweise stabil und sekundengenau.

D) Konfiguration des Shelly

  1. WiFi: Für einen dauerhaften Online-Betrieb ist hier mindestens eine WLAN-Verbindung einzutragen oder eine LAN-Verbindung (bei Pro Geräten) zu nutzen. Soll die Uhr Offline betrieben werden, ist hier die Eintragung eines Smartphone-Hotspot empfehlenswert. Alternativ oder zusätzlich kann der Shelly eigene Accesspoint aktiv gehalten werden, um darüber Laufzeit-Einstellungen vornehmen zu können.
  2. Switch 0 -> Settings -> Action on power on: Off
  3. Switch 1 -> Settings -> Action on power on: Restore last
  4. Veraltet: Switch 0 -> Actions -> Execute when "Switch toggled off" auswählen, Then do "http://127.0.0.1/rpc/Switch.Toggle?id=1" eintragen
    Dies ist in der gegenwärtigen Version per Skript implementiert und entfallt bis auf weiteres.

E) Schritte der Installation

  1. Auf der Website des Shelly in der Abteilung "Scripts" ein neues Skript anlegen und den Quellcode meines Skripts per Copy & Paste im Editor einfügen - Save selbstverständlich.
    Es sollte entweder das einzige Skript oder das zuerst angelegte Skript sein. Falls da schon Skripte liegen, vorher alle löschen! Das Skript sollte für einfaches Einrichten die Id 1 haben.
    Es ginge auch anders, dann aber mit zusätzlichen Fehlermöglichkeiten beim einrichten.

  2. Das Skript per Schiebeschaltersymbol "enablen", damit es beim booten gestartet wird.

  3. Auf http://tools.eichelsdoerfer.net oder per laden der clock_config.html (s. C 3.) in einen Web Browser die Seite zum einrichten der Schedule Jobs verwenden.
    Diese sollte weitgehend selbsterklärend sein. Es ginge auch ohne diese Unterstützung per sorgfältiger Eingabe des URL, wozu du aber genaue Kenntnisse brauchst.
    Die Links auf der Webseite werden so angezeigt, wie sie zusammengestellt werden müssen. Du kannst dir diese Links bzw. URL also genau anschauen und analysieren, musst es aber nicht.
    Auch kannst du damit experimentieren. Achte aber auf die Hinweise zu den Schedule Id! Wenn diese nicht stimmen, läuft die Anwendung nicht oder du musst dich in das Skript einarbeiten und darin zu anderen Schedule Id Anpassungen vornehmen.

Hinweise:

In der Konfiguration kannst du optional die Periode der Zeitanzeige vom Vorgabewert 12 (h) auf einen anderen Wert ändern. Zumeist wird die Alternative 24 (h) sein.

Ebenso optional ist die Einstellung eines Entscheidungsfaktors. Dieser Faktor lässt die Uhr darüber entscheiden, ob beim Nachstellen der Anzeige die Puls-Ausgaben oder das Warten verwendet wird.

Die andere HTML Datei clock_set.html steht dem Endanwender zum stellen der Uhr zur Verfügung. Mit dieser kannst du dieses Stellen testen.


Erläuterungen zu E 3.

Die Schedule Jobs arbeiten in jeder Minute zeitlich verzahnt und haben unterschiedliche Aufgaben. Diese Verzahnung erlaubt eine Reduktion der zeitgleich, asynchron abgearbeiteten RPC und Timer. Sind davon zuviele in Abarbeitung (vermutlich in einer Queue), führt dies zu einer Fehlermeldung mit Skriptabbruch. Diese Verzahnung unterstützt somit die Robustheit der Anwendung.

Ich habe in der genannten HTML Datei aus Gründen des Aufwandes und der Übersichtlichkeit bisher ausschließlich das Neuanlegen und das Löschen der Schedule Jobs implementiert. Du solltest also entweder vorher gut planen oder, wenn eine Änderung erforderlich ist, diese selbst per URL (Methode "Schedule.Update") eingeben (Adresszeile). Alternativ kannst du nacheinader alle angelegten Schedule Jobs löschen und in der richtigen Reihenfolge neu parametriert anlegen.

Die in den Jobs verwendeten Sekundenwerte sind bewusst genau so voreingestellt, damit in deren Kombination die Anwendung möglichst robust arbeitet. Wenn du diese Sekundenwerte ändern willst, solltest du genau wissen zu welchem Zweck.

Job 1: Zuständig für den regulären Modus. Er triggert das minütliche Ausgeben eines Impulses, damit die Uhranzeige eine Minute weiter rückt. Sekundenwert: 0 oder 59 - fast problemlos änderbar

Job 2: Zuständig für den Nachstellmodus nach einem Stromausfall oder einer Abschaltphase oder angehaltenem Skript. Er triggert in Abständen von 2s die nachzuliefernden Pulse. Sekundenwert: */2, also alle geraden Sekunden - möglichst nicht ändern ... größere Werte sind zulässig, wenn sie Teiler von 60 und gerade sind - dann stellt sich die Uhr langsamer richtig. Bei einer solchen Änderung ist allerdings zusätzlich im Skript noch eine Anpassung vorzunehmen. Vielleicht werde ich eine solche Anpassung bei Gelegenheit per Konfiguration erleichtern, aber eigentlich ist so etwas normalerweise nicht erforderlich.

Die Jobs 1 und 2 sind alternativ. Sie sind nie beide aktiv (enable=true). Sie sollten beide die gleiche Pulsdauer verwenden. Voreingestellt ist eine Pulsdauer von 500ms - änderbar.

Job 3: Zuständig für das automatische Richtigstellen der Uhr - inkl. Zeitumstellung zwischen Normalzeit und Sommerzeit. Dies funktionert mit beliebigen Änderungen der lokalen Zeit - auch wenn dies einmal abgeschafft wird. Ist während der offiziellen Umstellung die Stromversorgung nicht vorhanden, holt diese der Shelly per Skript und Job 3 nach. Sekundenwert fest

Job 4: Dieser ist optional und, falls vorhanden, zuständig für das regelmäßige Starten des Skripts. Das Starten des Skripts bewirkt bei bereits laufendem Skript nichts. Dies erlaubt den Betrieb der Anwendung über lange Dauer, ohne dass der Anwender eingreifen muss. Hier kannst du wählen zwischen stündlichem (Stundenwert: *) und täglichem Starten (fester Stundenwert). Ich empfehle den täglichen Start, weil so evtl. vorhandenes Fehlverhalten besser erkennbar ist und ich oder jemand sonst bei Bedarf den Fehler beseitigen könnte. Bei stündlichem Starten hast du noch die Option den Stundenabstand zu nutzen per "*/x", worin x den Stundenabstand festlegt, bspw. "*/3" startet das Skript alle 3 Stunden. Genauer: Das Skript wird dann zu jedem Stundenwert gestartet, der durch 3 ohne Rest teilbar ist.

Job 4 sollte überflüssig sein, da das Skript in der aktuellen Version sehr stabil läuft. Er steht aber als Option zur Verfügung für den Fall, dass aus irgendwelchen Gründen das Skript zuweilen abgebrochen werden sollte.


Falls du nach eingehender Beschaftigung mit meiner Implementation noch Fragen stellen  möchtest, bitte ich darum, dies im https://www.shelly-support.eu/forum/ zu tun. Dort nutze ich den Nick "eiche".