Jump to content

Zeitgesteuert Funksteckdosen schalten ....


Recommended Posts

Möchte gerne Funksteckdosen zeitgesteuert schalten.

Dazu möchte ich in einer Datenbank bis zu vier Schaltzeiten hinterlegen.

z.b. Steckdose 1: AN 10:00 AUS 10:15 / AN 14:00 AUS 14:15 etc ......

wie frage ich das mit einem CronJob ab?

Dachte das alle 5 min ein Python oder PHP Script gestartet wird um zu schauen ob jetzt was geschaltet werden soll.

 

lg Sascha

 

Link zu diesem Kommentar
Share on other sites

Dachte das alle 5 min ein Python oder PHP Script gestartet wird um zu schauen ob jetzt was geschaltet werden soll.

 

Ja, das ist eine gute Möglichkeit das zu tun.

 

Dein Script wird alle 5 Minuten durch cron gestartet. Bei jedem Start schaut dein Script in deiner Datenbank nach ob es gerade Zeit ist etwas an oder aus zu schalten. Falls das der Fall ist schaltet das Script nach Vorgabe aus der Datenbank. Oder falls gerade nichts zu schalten ist tut dein Srcipt nichts und beendet sich wieder. Das ganze beginnt dann alle 5 Minuten von neuem.

 

Worauf du dabei möglicherweise achten musst, ist der Zeitprüfung etwas Ungenauigkeit zu erlauben. Je nachdem wie exakt cron die Zeiten einhält sollte dein Script z.B. 10:14-10:16 noch als 10:15 interpretieren.

Link zu diesem Kommentar
Share on other sites

Worauf du dabei möglicherweise achten musst, ist der Zeitprüfung etwas Ungenauigkeit zu erlauben. Je nachdem wie exakt cron die Zeiten einhält sollte dein Script z.B. 10:14-10:16 noch als 10:15 interpretieren.

Wozu Ungenauigkeiten "erlauben"? Einfach in die DB die Ein/Aus-Zeiten mit von-bis eintragen. Das Skript kann dann einfach regelmässig prüfen ob die aktuelle Uhrzeit innerhalb einer "An"-Zeit oder einer "Aus"-Zeit ist und danach agieren. Dann ist es egal, ob sich der Cron mal eben etwas verschlafen hat ;)

Link zu diesem Kommentar
Share on other sites

Also mache ich eine Tabelle mit Uhrzeiten:

Zeit:            09:00 09:15 09:30 09:45 etc.

Schalter 1:    AN          AUS         

Schalter 2:              AN            AUS

Habe aber noch kein Ansatzpunkt wie ich das Script schreibe.

Mir fehlt da im Moment noch die Phantasie.

 

lg Sascha

 

Link zu diesem Kommentar
Share on other sites

  • 2 weeks later...

Hallo,

 

ich habe heute Abend hier mal rein geschaut und da bin ich auf diese Thema gestossen, ich habe mir das schon länger mal gedacht, dass eine Art Zeitschaltuhr was tolles wäre, gerade wenn man mal im Urlaub sein sollte könnte man so Leben simulieren ;)

 

Ich hab mich mal dran gesetzt, Datenbank erstellt (ähnliche Struktur wie auch hier oben) und mit Testdaten gefüllt.

 

Da ich bereits die ganze Zeit schon eine Art APP hatte um die vier Steckdosen zu steuern hatte ich es einfach und da konnte ich die ganzen Schaltvorgänge kopieren. (Hardware Hacking Kit)

 

Ich muss eigentlich nur noch eine Oberfläche für das Eintragen von Aktionen programmieren und schon ist Version 1 fertig. Allerdings wäre mir ein schönerer Rhythmus noch lieber. Zum Beispiel täglich, an Werktagen etc. dafür habe ich aber spontan noch keine Lösung wie ich das lösen könnte.

 

Gruß

Bildschirmfoto_2014-10-13_um_23_03_13.png.6259ebd19a1b3773c7404dbb83e6bcd3.png

Link zu diesem Kommentar
Share on other sites

Denkbar wäre eine weitere Spalte in der z.B. die Werte "täglich", "jeden Montag", "jeden Dienstag", ..., "jeden 1. des Monats" usw. mit abgelegt werden. Diese Werte müssten dann mit einer gewissen Priorität behandelt werden. Hab ich also in der DB einen Wert mit "jeden Montag" eingetragen, müsste dieser Eintrag den Vorzug vor einem Eintrag mit "täglich" erhalten.

 

So genau hab ich das jetzt gedanklich auch noch nicht durchgespielt und möchte hier jetzt nicht behaupten, dass das frei von Problemen ist oder es gar einfachere Lösungen dafür gäbe, könnte aber ein Ansatz sein.

Link zu diesem Kommentar
Share on other sites

ohje Priorisierung soweit will ich an der Stelle mal noch gar nicht gehen.

 

Ich habe aber jetzt zum Testen mal die Datenbanktabelle ergänzt um "repeat" und "repeatintervall" ist repeat auf 0 ist es eine einmalige Aktion, der Datensatz wird in dem Fall dann einfach als "done" markiert und nicht wieder ausgeführt.

 

In dem Versuch will ich mal probieren, dass repeat=1 (1 für Tage) und dann als repeatintervall=7 (eben eine Woche) am Ende der Aktion neu in die Datenbank als neuer Ausführungszeitpunkt geschrieben wird, soetwas lässt sich ja noch ganz gut umsetzen.

 

Gruß

Link zu diesem Kommentar
Share on other sites

Das hört sich jetzt ziemlich nach unnötiger verkomplizierung an.

 

Wenn ich eine Aktion als einmalig definiere, dann hab ich dazu ein bestimmtes Datum mit einer bestimmten Uhrzeit. Ist dieser Zeitpunkt überschritten, wird der Datensatz ohnehin nicht mehr abgerufen - die Markierung mit "done" erscheint mir hier überflüssig.

 

Und warum für Wiederholungen ständig automatisch neue DB-Einträge gemacht werden sollen erschließt sich für mich ebenfalls nicht.

 

Ich will hier jetzt nicht schlauer sein als andere - aber für mich klingt das ein bisschen wie etwas, zu dem ich gern "würg-around" sage :)

Link zu diesem Kommentar
Share on other sites

Ok, in einem Punkt muss ich Dir recht geben, wenn es nur einmalig sein soll kann man es löschen. Aber wenn ich zum Beispiel eine vergangene Aktion mal prüfen will "warum ist denn das Licht heute an?" kann ich das so natürlich nicht machen, dann ist es nun mal so.

 

Bei den Wiederkehrenden Ereignissen mache ich keinen neuen Eintrag, den bereits existierenden Update ich auf das nächste Datum. Die Done Markierung ist hier dann natürlich auch unnötig.

 

mysql_query("UPDATE `zeitschaltung` SET `time`=DATE_ADD('$row[time]', INTERVAL $row[repeatintervall] DAY) WHERE `ID`=$row[iD]");

Link zu diesem Kommentar
Share on other sites

Aber wenn ich zum Beispiel eine vergangene Aktion mal prüfen will "warum ist denn das Licht heute an?" kann ich das so natürlich nicht machen, dann ist es nun mal so.

Du willst einen Logger haben :)

 

Bei den Wiederkehrenden Ereignissen mache ich keinen neuen Eintrag, den bereits existierenden Update ich auf das nächste Datum. Die Done Markierung ist hier dann natürlich auch unnötig.

 

mysql_query("UPDATE `zeitschaltung` SET `time`=DATE_ADD('$row[time]', INTERVAL $row[repeatintervall] DAY) WHERE `ID`=$row[iD]");

Für meine Begriffe ist das ständige Updaten unnötig - aber ok, kann man auch machen.
Link zu diesem Kommentar
Share on other sites

An einer Stelle muss man denke ich Abstriche machen  ;)

 

Wenn ich das Datum update habe ich es mit der Abfrage nicht so schwer,

wenn nicht müsste ich zum Beispiel bei "Wiederholung jeden 5. Tag" eine SQL Abfrage basteln, die zu einem gewissen Startzeitpunkt berechnet ob es denn jetzt auch der 5. Tag ist, könnte denke ich bei mehr als 2 bis 3 Varianten etwas kompliziert werden.

 

Alle Eventualitäten wird man da auch nicht abdecken können, wenn ich an Programmierungen denke wie "Licht an jeden Tag um 7 aber nicht Mittwochs da schon um 6 und an Samstagen, Sonntagen und Feiertagen an Urlaubstagen natürlich erst recht nicht ...." soll ja Leute geben die wollen das so  ;D

 

Oder seh ich das an der Stelle falsch?

Link zu diesem Kommentar
Share on other sites

So kurzes Resume der heutigen Arbeit.

 

Die Weboberfläche (mit responsive Design) nimmt Gestalt an, nachdem die Auslösung der Aktionen soweit ganz gut funktioniert.

 

Anbei mal ein paar Screenshots. So ganz zufrieden bin ich nicht, ich will noch einen einfachen Kalender einblenden, der das Datum dann im richtigen Format einfügt.

 

Außerdem fehlt noch die Bearbeiten Funktion in der Übersicht, Löschen kann man Einträge ja schon genau so wie neue Eintragen.

 

Gruß

Bildschirmfoto_2014-10-15_um_23_39_13.thumb.png.3927220db739e2ec63b164ec84031f78.png

Bildschirmfoto_2014-10-15_um_23_39_30.thumb.png.b9c9ae156434aa427aca66b15898032a.png

Bildschirmfoto_2014-10-15_um_23_39_57.thumb.png.cf98c205c1ddf7b6afe01f5840ec42f0.png

Bildschirmfoto_2014-10-15_um_23_40_08.thumb.png.b895be6966316be2c0116a2b25cf876b.png

Link zu diesem Kommentar
Share on other sites

  • 2 weeks later...

Hallo,

 

das letzte Update ist jetzt schon über eine Woche her.

Seitdem hat sich viel getan. Ich habe jetzt so einiges hinzugefügt, das insgesamt zu einem ruhigeren Konzept führt.

 

1. Es können jetzt Aktionen angelegt werden und dort individuell welche Geräte zugehörig sind.

 

2. Außerdem können Bedingungen hinterlegt werden, zum Beispiel an welchen Wochentagen die Aktion ausgeführt werden soll.

 

Die Option für Feiertage befindet sich bereits auch schon in der Auswahlliste, allerdings bin ich mir noch nicht ganz sicher wie genau ich das hinterlege, wahrscheinlich in einer extra Tabelle, in der man die Feiertage eintragen kann, es gibt ja feste und variable, wobei die auch wieder von Bundesland zu Bundesland unterschiedlich sind.

 

Gruß

 

 

Link zu diesem Kommentar
Share on other sites

Klasse Sache, danke Dir.

 

Jetzt bin ich allerdings am überlegen, wie man da am besten den Cache baut, will ja nicht bei jeder Prüfung Deinen Server beanspruchen, da kommt aktuell schon ganz schön was zusammen an Anfragen die bearbeitet werden wollen.

 

Meine erste Überlegung war, dass ich das ganze über ein Datei Cache anlege, sprich prüfe, ob eine Datei mit heutigem Tag im Cache liegt und da einfach notiere, ob es ein Feiertag ist oder nicht, keine Datei vorhanden, dann wird Deine API befragt und das Ergebnis in Dateiform festgehalten.

 

Zweite Überlegung ist, einfach alle Feiertage einmalig in eine Tabelle zu schreiben, drückt die Anfragen natürlich auf ein Minimum, allerdings sind ggf. Fehlerkorrekturen nicht aktuell...

 

Aktuell habe ich aber das Problem, dass gestern Früh einige Aktionen stecken geblieben sind, keine Wichtigen, aber trotzdem merkwürdig, eventuell wurde der Cronjob nicht korrekt ausgelöst und daher die Schaltung verpasst. Ohne Großartig einzugreifen (Datum manuell auf zukünftig gesetzt) ist es wieder ohne Probleme gestartet, dafür müsste ich noch ein Fallback einbauen, dass wenn die Schnittstelle mal nicht erreicht werden kann trotzdem keine Aktion hängen bleibt.

 

Und ein kurzes Update an der Stelle noch, ich habe am noch zwei bzw. drei weitere Aktionen eingebunden in wenigen Minuten.

Die ganze Zeit bin ich davon ausgegangen über das Hardware Hacking der Funksteckdosen die vier Steckdosen zu schalten, allerdings habe ich die Verschaltung von "Geräten" und Bedingungen nun soweit, dass ich das auch gut für andere "Geräte" verwenden kann. In dem Fall habe ich das LCD Display als Gerät hinzugefügt und eine Aktion angelegt, die alle 60 Minuten das Backlight einfach ausschaltet, zudem habe ich das 7 Segment Display mit eingebunden und lass über die Aktion einfach alle 10 Minuten die Temperatur updaten, und um 5 Minuten versetzt die Luftfeuchtigkeit.

Der einzige Eingriff in den ganzen Code betrifft eigentlich nur diese paar Zeilen

 

elseif($row['action']==1 && $device['device_id']==7){
// Turn backlight on
  $lcd->backlightOn();
}
elseif($row['action']==0 && $device['device_id']==7){
// Turn backlight on
  $lcd->backlightOff();
}

 

Eigentlich aus dem Grund weil dazu noch die passenden Bibliotheken von TF hinzu müssen, aber das ist ja kein Aufwand.

 

Gruß

Link zu diesem Kommentar
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...