saschakp Geschrieben September 29, 2014 at 19:15 Geschrieben September 29, 2014 at 19:15 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 Zitieren
photron Geschrieben September 30, 2014 at 08:06 Geschrieben September 30, 2014 at 08:06 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. Zitieren
TinkerQ Geschrieben October 1, 2014 at 10:17 Geschrieben October 1, 2014 at 10:17 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 Zitieren
saschakp Geschrieben October 2, 2014 at 08:48 Autor Geschrieben October 2, 2014 at 08:48 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 Zitieren
TinkerQ Geschrieben October 2, 2014 at 09:40 Geschrieben October 2, 2014 at 09:40 So würde ich jetzt die Tabelle anlegen. Dein Script frägt dann die Datensätze ab, die grad in der aktuellen Uhrzeit liegen. Zitieren
TinkerQ Geschrieben October 13, 2014 at 11:04 Geschrieben October 13, 2014 at 11:04 Ist was draus geworden? Wenn ja: wie wurde es gelöst? Wenn nein: weitere Hilfe benötigt? Zitieren
m2andyou Geschrieben October 13, 2014 at 21:04 Geschrieben October 13, 2014 at 21:04 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ß Zitieren
TinkerQ Geschrieben October 14, 2014 at 07:35 Geschrieben October 14, 2014 at 07:35 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. Zitieren
m2andyou Geschrieben October 14, 2014 at 17:11 Geschrieben October 14, 2014 at 17:11 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ß Zitieren
TinkerQ Geschrieben October 14, 2014 at 17:29 Geschrieben October 14, 2014 at 17:29 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 Zitieren
m2andyou Geschrieben October 14, 2014 at 17:34 Geschrieben October 14, 2014 at 17:34 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]"); Zitieren
TinkerQ Geschrieben October 14, 2014 at 17:56 Geschrieben October 14, 2014 at 17:56 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. Zitieren
m2andyou Geschrieben October 14, 2014 at 18:05 Geschrieben October 14, 2014 at 18:05 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 Oder seh ich das an der Stelle falsch? Zitieren
TinkerQ Geschrieben October 14, 2014 at 18:15 Geschrieben October 14, 2014 at 18:15 Ja, hier kommen eben Prioritäten ins Spiel Jeden Tag um 7, außer Mittwoch - da schon um 6 und am ersten jeden Monats sogar schon um 5 - egal ob Mittwoch oder ein anderer Tag Aber eine konkrete Umsetzung hab ich hier auch grad nicht im Kopf Zitieren
m2andyou Geschrieben October 15, 2014 at 21:44 Geschrieben October 15, 2014 at 21:44 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ß Zitieren
raphael_vogel Geschrieben October 16, 2014 at 07:24 Geschrieben October 16, 2014 at 07:24 Mit welcher JS Bibliothek hast du denn das UI gebaut? Zitieren
derAngler Geschrieben October 16, 2014 at 07:39 Geschrieben October 16, 2014 at 07:39 Sieht nach bootstrap oder node.js aus. Zitieren
m2andyou Geschrieben October 16, 2014 at 07:44 Geschrieben October 16, 2014 at 07:44 Hallo, das ist bootstrap Gruß Zitieren
derAngler Geschrieben October 16, 2014 at 09:28 Geschrieben October 16, 2014 at 09:28 Nice, mit bootsrap arbeite ich derzeit auch. Steuerst du die TF-Bauteile direkt über js & bootstrap, oder hast du (wie ich) ein Skript auf dem RasPi/PC laufen und kommunizierst dann per js mit diesem Skript? Zitieren
m2andyou Geschrieben October 16, 2014 at 09:46 Geschrieben October 16, 2014 at 09:46 Ja wenn man sich mal dran gewöhnt ist das super, so hat man auch gleich eine APP. Das liegt alles in Form von PHP Skripten vor, ist mir am geläufigsten. Im Hintergrund die PHP Sammlung von Tinkerforge. Angesteuert wird das ganze dann über die Ethernet Extension. Gruß Zitieren
m2andyou Geschrieben October 24, 2014 at 19:34 Geschrieben October 24, 2014 at 19:34 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ß Zitieren
Robin Geschrieben October 25, 2014 at 10:11 Geschrieben October 25, 2014 at 10:11 Solange du nur Feiertage (und Ferien) für Deutschland brauchst, ich hätte da was: http://blog.smartnoob.de/2014/04/15/ferien-feiertag-api-fuer-deutschland/. Vielleicht kannst du die API ja gebrauchen. Zitieren
m2andyou Geschrieben October 26, 2014 at 12:28 Geschrieben October 26, 2014 at 12:28 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ß Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.