Endlich ist die neue Version meines smartHome Projekts soweit das ich sie Euch präsentieren kann.
Eine „Multi-Client“ fähige Software Zeitschaltuhr mit html5 Frontend im Responsive Design.
Bei github steht die neue Version bereits seit dem 08.02.2016 zur Verfügung.
Es tut mir leid das es mal wieder so lange gedauert hat.
Teilweise konnte ich mich nicht motivieren, teilweise gab es mehr Probleme als erwartet.
Und zu guter letzt musste ich auch noch Schnittstellen standardisieren und Projekt-Spezifikationen festlegen.
Herausgekommen ist eine neue Version mit den folgenden Neuerungen:
datenbank
- die Datenbank wurde stark erweitert
- es gibt eine neue Tabelle für die allgemeinen Einstellungen
- die neue Tabelle für die Clients spielt in der Datenbank eine zentrale Rolle
- es wurden Vorbereitungen für das einbinden von Sensoren getroffen
- welcher Client welche Schalter nutzt wird über die Datenbank definiert, entsprechende Einstellungen bei den clients entfallen
- voreingestellter Schalter-Typen für Gembird SIS USB Steckdosenleiste, Tinkerforge Dual Relay, Tinkerforge Industrial Quad Relay, Tinkerforge RemoteSwitch und raspberry pi GPIO
html-frontend (html-test-area.mausbiber-projekte.de)
- geändertes Vorschau-Design der Zeitschaltuhr
- Menü funktioniert endlich
- neuer Menü-Eintrag für die „Einstellungen“
- Dialog zum Anlegen von neuen Hardware-Clients
- Dialog zum Anlegen von neuen Schalter-Arten
- Dialog zum Anlegen von neuen Schaltern
- Vorbereitung für weitere Einstellungen (Allgemein)
- problematisch: die Verbindung zum smartHome-Server über javascript & websockets funktioniert noch nicht zu 100%
sh-server & sh-client
- die Software für geteilt in einen Servercode und einen Clientcode
- beides kann auf dem gleichen Rechner oder auf verschiedenen Systemen laufen
- multi-client-fähig, d.h. ich kann soviele Raspberry Pis (oder andere Systeme) ansteuern wie es das Netzwerk zulässt
- GPIO-Port reichen nicht? Einfach einen 2. Client anlegen und das war es
- die Client-Software besorgt sich ihre Infos über angeschlossene Sensoren & Schalter über die Datenbank, keine Konfiguration nötig
- notwendige Startinformationen werden sowohl beim Servercode als auch beim Clientcode über eine neue config.py erledigt
- es müssen lediglich die client-ip, sowie server- und mysql-Zugangsdaten angegeben werden
- ein Linux Start/Stop-Skript ist neu dabei
- es gibt eine Standardisierte Schnittstelle zu den Schaltern
- die Schalter geben über das websocket-Protokoll Antwort (kann später genutzt werden um im Frontend in Echtzeit Schaltzustände anzuzeigen)
raspbian-image (Link)
- basiert auf raspbian wheezy
- aktualisiert mit Stand 09.02.2016
- vorinstallierte Software:
proftpd mit Zugangs zu „/smartHome/“
nginx als Webserver (inkl. php)
mysql mit voreingestellter Datenbank
python3.4 inkl. notwendiger Erweiterungen (websockets, tinkerforge, pyusb, …) - vorinstalliertes smartHome System inklusiv Datenbank, html5-Frontend
- sh-server & sh-client werden automatisch gestartet
- einzig IP-Adressen müssen angepasst werden
Funktionsweise
Dreh- und Angelpunkt des neuen Systems sind die Hardware-Clients, darunter verstehe ich die verschiedenen Raspberry Pi’s/PC’s die als Sensor- und Steuerungsplattform dienen sollen.
Die einzelnen Schalter/Sensoren definieren sich zum einen über den Typ des Schalters (Relais, GPIO, Funk, …) oder des Sensors (Temperatur, Licht, …) und zum anderen über den Hardware-Client dem sie zugeordnet sind.
Um die Zeitschaltuhr zu nutzen muss mindestens 1 x Hardware-Client angelegt werden (Menüpunkt „Einstellungen – Allgemein“), sowie wie mindestens 1 x Schalter-Typ und 1 x Schalter angelegt sein (Menüpunkt „Einstellungen – Schalter“).
Die Hardware-Clients identifizieren sich über die vergebene IP-Adresse, diese muss einmal in der Datenbank beim Anlegen des Clients angegeben werden und ein zweites mal in der config.py der Client-Software. Wichtig, beide IP-Adressen müssen identisch sein.
Gehen wir das Ganze mal grob durch:
- Zuerst legen wir einen Hardware-Client an und geben Ihm einen Namen und eine IP-Adresse
- Im nächsten Schritt definieren wir die Art der Schalter die wir nutzen wollen (voreingestellt sind Gembird SIS USB Steckdosenleiste, Tinkerforge Dual Relay, Tinkerforge Industrial Quad Relay, Tinkerforge RemoteSwitch und raspberry pi GPIO) und geben dem Typ einen Namen
- Jetzt sind wir soweit einen Schalter anlegen zu können.
Dafür geben wir dem Schalter einen Namen, weisen ihm einen Schalter-Typ (z.Bsp. GPIO) und einen Hardware-Client zu.
Jetzt müssen nur noch die Felder argA – argD ausgefüllt werden.
Welche Werte hier rein kommen hängt vom Schalter-Typ ab. Bei dm Typ GPIO kommt in das Feld „argA“ nur die Nummer des GPIO-Pins der geschaltet werden soll, z. Bsp. „23“.
Bei SIS USB kommt in das Feld „argA“ die Nummer der Steckdose die man schalten will, also 1,2,3 oder 4.
Bei den Tinkerforge-Relais-Schaltern kommt in das erste Feld „argA“ die ID des Bricklets (z.Bsp. „jMj“) und in das zweite Feld die Nummer des Relais das geschaltet werden soll, z.Bsp. „2“
Die Tinkerforge Funk-Schalter bekommen in Feld „argA“ auch die Bricklet-ID und in die Felder „argB“, „argC“ und „argD“ kommt der Funkcode. - Nachdem wir einen Schalter angelegt haben können wir diesen in der Zeitschaltuhr benutzen.
Die Funktionsweise der Zeitschaltuhr hat sich gegenüber der alten Version nicht geändert.
Grundsätzlich arbeitet das System jetzt mit 2 x Programmteilen.
Da ist zum einen die Server-Software. Diese ist einerseits das Bindeglied zwischen html-Frontend und den Hardware-Clients, zum anderen erledigt sie clientübergreifende Aufgaben wie eben die Steuerung der Zeitschaltuhr.
Kommunziert wird über das websocket-Protokoll und json-Datenformat.
Erhält die Server-Software nun einen Befehl vom html-Frontend, so leitet sie diese an die Hardware-Clients weiter.
Ist der Zeitpunkt zum schalten eines Vorgangs gekommen, dann schickt die Server-Software den entsprechenden Befehl an die Hardware-Clients.
Umgekehrt geben die Hardware-Clients Änderungen an den Schaltzuständen oder geänderte Sensorwerte an die Server-Software weiter, welche diese dann an die html-Frontends verteilt um damit „Live“-Ansichten zu ermöglichen (Schalter im frontend springt automatisch um wenn z.Bsp. per Zeitschaltuhr geschaltet wird).
Die Client-Software schaut nach dem Start zuerst nach welche IP ihr über die config.py zugeteilt wurde.
Dann wird mit dieser IP eine Datenbankabfrage durchgeführt und geschaut welche Schalter/Sensoren dieser IP zugeordnet sind.
Danach beginnt die Software damit die Liste an Schaltern/Sensoren durchzugehen und zu initialisieren.
Da der alle Schalter als Klassen eingebunden werden und die Klassen über die gleichen Funktionen zur Kommunikation nach außen verfügen war es mir möglich den Sourcecode stark zu vereinfachen.
Wie genau das Ganze funktioniert werde ich am Wochenende in dem Beitrag zur Projektspezifikation näher erklären.
Installation
Am leichtesten habt ihr es natürlich mit meinem neuen raspberry-pi-image, für alle anderen will ich mich an einer groben Installationsanleitung versuchen.
Ganz ohne Linux-Grundkenntnisse wird es wohl nicht funktionieren, zumindest mit python kommt Ihr eigentlich nicht mehr in Kontakt.
Ich gehe im folgenden beispielhaft davon aus das Ihr einen Raspberry Pi nutzen und alles notwendige an Software (mysql, apache/nginx, python) bereits installiert und konfiguriert ist.
Um es einfacher zu halten nehme ich weiter an das wir alle Programmteile (mysql, sh-server & sh-client) auf dem gleichen Rechner laufen lassen wollen.
Ich persönlich rate dazu zumindest den Webserver, als auch den mysql-Server auf einem stärkeren PC zu installieren, anstatt auf dem raspberry pi. Das macht sich in der Reaktionszeit deutlich bemerkbar – ansonsten sollte es zumindest ein raspberry pi 2 sein.
- Als erstes laden wir die Software von github runter (alle Ordner).
- Dann fangen wir mit dem Einrichten der Datenbank an. Sie ist Dreh- und Angelpunkt und muss deshalb zuerst installiert werden.
Dafür gibt es verschiedene Wege und Tools:
Man kann phpmyadmin installieren, man kann über die Linux-Kommandozeile arbeiten oder wie ich vom Desktop-Rechner übers Netzwerk mysql Workbench nutzen – das bleibt euch überlassen.
Wichtig ist nur das Ihr eine Datenbank „smartHome“ anlegt und die Datei „mysql_dump.sql“ aus dem Ordner „database“ in selbige importiert.
Wenn das erfolgreich geklappt habt geht es weiter. - Jetzt kümmern wir uns um das html-Frontend.
Dazu kopieren wir alle Dateien aus dem Ordner „html-frontend“ in unser Apache/nginx-Webverzeichnis.
Danach müssen wir die Datei „config.py“ aus dem Ordner „includes“ öffnen und die Zugangsdaten zur mysql-Datenbank eintragen. - Auf einem raspberry pi sollten wir aus performance Gründen noch zusätzlich die Datei „scheduler.next-widget.inc.php“ aus dem gleichen Ordner (includes) öffnen und dort zum einen den Abschnitt „(„+14 days„);“ auf „(„+7 days„);“ ändern und zum anderen den Abschnitt „if ($zaehler>50) break;“ umändern in „if ($zaehler>25) break;“.
- Jetzt sollte das html-Frontend schon funktionieren und wir sollte das auch gleich einmal testen.
Also Browser öffnen, Adresse unseres raspberry pi eingeben und schauen was passiert (Bsp. „192.168.128.55/scheduler/“).
Achtet aber auf das „/scheduler/“ nach der Adresse.
Wenn das nicht funktioniert gab es irgendwo einen Fehler. Der muss gefunden werden bevor es weiter gehen kann. - Als nächstes installieren wir die smartHome-Software und fangen mit der Server-Software an.
Dafür legen wir zuerst auf unserem raspi einen Ordner an, z.Bsp. „/smartHome/server“. In diesen kopieren wir nun die Datei sh-server.py & config.py aus dem Ordner „server“.
Danach öffnen wir die Datei „config.py“ und passen dort die IP-Adressen und Zugangsdaten an.
Jetzt kopieren wir nur noch die Datei „server-startup.sh“ in das Verzeichniss „/etc/init.d/“ und machen sie mit dem Befehl „chmod +x server-startup.sh“ startfähig.
Schlußendlich wird die Server-Software zum aktuellen Runlevel hinzugefügt, das geht über „update-rc.d server-startup.sh defaults 90“.
Damit sollte der Server installiert sein. - Kommen wir zum smartHome-Client. Dieser wird fast genauso installiert wie der Server-Teil.
Wir legen einen Ordner „/smartHome/client“ an und kopieren in diesen die Datei „sh-client.py“ & „config.py“.
Die Datei „config.py“ muss wieder von uns geöffnet werden und auch dort müssen IP’s und Zugangsdaten aktualisiert werden.Das Start-Skript „client-startup.sh“ wird wieder nach „/etc/init.d/“ kopiert und per „chmod +x …“ ausführbar gemacht.
Nun fügen wir mit „update-rc.d client-startup.sh defaults 99“ die Client-Software in das aktuelle Runlevel ein. - Eventuell müssen in den 2 x Start-Skripten (server-startup.sh & client-startup.sh) noch die Datei-Pfade und -Namen angepasst werden, das hängt aber davon ab wo genau Ihr die Software installiert habt.
- Im Prinzip fehlen jetzt nur noch die „libs“.
Diese befinden sich logischerweise im Ordner „libs“, von dort kopieren wir die Dateien „lib_timerswitch.py“ & „lib_pid.py“ nach „/sourcecode-server“ und die restlichen Dateien (lib_tinkerforge, lib_sispm & lib_gpio) kopieren wir nach „/sourcecode-client“. - Das war es.
Nach einem Neustart des Raspberry Pi’s sollte alles funktionieren.
Ausblick
In den nächsten Tagen werde ich noch 2 x weitere Beiträge veröffentlichen.
In dem ersten werde ich kurz mein neues „Demo“-raspbian-image vorstellen und wo dort was zu finden ist.
Im zweiten Beitrag werden dann endlich die Projekt-Spezifikationen folgen.
Dort werde ich im Detail erklären wie die Software intern arbeitet, wie ich mir die Schnittstellen vorstelle und wie man am leichtesten eigene Erweiterungen programmieren kann.
Ansonsten steht als nächstes das Anpassen des html-Frontend auf dem Plan, derzeit sieht es auf Smartphones noch nicht gut aus.
Danach folgen noch eine Menge kleinerer Fehlerbeseitigungen.
Die nächste größere Neuerung wird ersten das Einbinden von Sensoren, und zweitens das Einbinden einer „Schalter-Seite“ im html-frontend sein – sprich die Möglichkeit alle angelegten Schalter auch manuell per frontend bedienen zu können.
Update: Das html-frontend ist jetzt für Smartphones/Tablets optimiert.
Hallo Christopher, ich suche schon lange nach einem Projekt wie diesem, leider bin ich ein blutiger Anfänger im Pi Bereich. Auch aus diesem Grund war ich dankbar als ich Dein Projekt gefunden habe.
Mir geht es konkret darum die GPIOs von meinem Tablet aus steuern zu können. Das war soweit ja alles relativ einfach mittels Apache und ein bisschen html, php, usw. Bei der Zeitsteuerung bin ich dann ausgestiegen. Mir fehlen hier schlicht die SQL Grundlagen. Also war meine Hoffnung groß als ich Dein Projekt entdeckt habe.
Leider bekomme ich Dein Image auf meinem Pi 3 B+ nicht zum laufen und sehe schon beim Startprozesses nur einen bunten Bildschirm. Ich habe Dein Image mittels Raspberry Pi Imager Tool auf meine Karte geschrieben. Was mache ich falsch?
Danke und Gruß Sascha
Ich muss leider sagen das ich das Projekt nicht mehr weiterverfolge.
Ich habe für mich selbst HomeAssistant gefunden. https://www.home-assistant.io/
Das gefällt mir von der Oberfläche sehr gut und ist im Zusammenspiel mit ESPHome einfach der Hammer. https://esphome.io/index.html#
Der Zeitaufwand für eine Eigenentwicklung steht in keinem Verhältnis zu dem Ergebnis, vor allem wenn man alles alleine macht.
Tolles Projekt, aber bräuchte dringend mal ein Update. Habe zum Test einen rasPi 3B+ mit Buster aufgesetzt, läuft unter den aktuellen Version mit Python3.7 aber leider nicht. Fehler:
task = asyncio.async(sending_loop_clients(websocket))
SyntaxError: invalid syntax
Ich muss leider sagen das ich das Projekt nicht mehr weiterverfolge.
Ich habe für mich selbst HomeAssistant gefunden. https://www.home-assistant.io/
Das gefällt mir von der Oberfläche sehr gut und ist im Zusammenspiel mit ESPHome einfach der Hammer. https://esphome.io/index.html#
Der Zeitaufwand für eine Eigenentwicklung steht in keinem Verhältnis zu dem Ergebnis, vor allem wenn man alles alleine macht.
Hey genau so was habe ich gesucht… musste es gleich mal ausprobieren… funktioniert super großes Lob an dich!
Hab aber da mal trotzdem noch eine Frage…
Lässt sich ein 1wire Thermometer anbinden und ggf auch funksteckdosen schalten?
Ich sage einfach mal ja das geht.
Allerdings müsste man dann den Code entsprechend erweitern.
Hi,
sehr schönes Projekt, schade ist das img läuft nicht auf einem pi3+. Bei einer Manuellen Installation bekommen ich immer
python3 /home/pi/smartHome/server/sh-server.py
File „/home/pi/smartHome/server/sh-server.py“, line 106
task = asyncio.async(sending_loop_clients(websocket))
^
SyntaxError: invalid syntax
Hey,
gibt es noch Neuerungen hier oder ist die Seite so gut wie verschollen?
Dein Script ist genau das was ich benötige für meine Gartenbewässerung, leider ist es bei mir nicht lauffähig mit dem fertigen Image
Verschollen ist ein gutes Wort.
Aufgegeben habe ich das ganze noch nicht, aber aktuell geht das Geld verdienen leider vor.
Wenn ich das Image benutze… wie sind denn die Logindaten?
Und warum fehlt in dem Frontend das Dashboard und die Sensoreingabe?
Hallo zusammen,
Erstmal großes Lob an dich, klingt alles echt super, ich habe aber ein Problem. Egal ob ich das ganze über das Image versuche oder alles manuell installiere ich bekomme immer den selben fehler beim Server, der Client startet ohne probleme, jemand eine Idee?
2018-02-11 19:26:02 : smartHome Server startet
2018-02-11 19:26:02 : mySQL ……… (127.0.0.1:3306, DB:smartHome) Verbindung online
Traceback (most recent call last):
File „/smartHome/server/sh-server.py“, line 259, in
timer = TimerSwitch(logger, datenbank, action)
File „/smartHome/libs/lib_timerswitch.py“, line 27, in __init__
self._scheduler.start()
File „/usr/local/lib/python3.4/dist-packages/apscheduler/schedulers/base.py“, line 138, in start
self.add_executor(self._create_default_executor(), ‚default‘)
File „/usr/local/lib/python3.4/dist-packages/apscheduler/schedulers/asyncio.py“, line 67, in _create_default_executor
from apscheduler.executors.asyncio import AsyncIOExecutor
File „/usr/local/lib/python3.4/dist-packages/apscheduler/executors/asyncio.py“, line 9, in
from apscheduler.executors.base_py3 import run_coroutine_job
File „/usr/local/lib/python3.4/dist-packages/apscheduler/executors/base_py3.py“, line 12
async def run_coroutine_job(job, jobstore_alias, run_times, logger_name):
^
SyntaxError: invalid syntax
Also ich habe mir die Software heute mal von github gezogen und bis auf einen Fehler im mysql-Dump (fehlt eine Spalte „status“ in der Tabelle „switches“ – wird morgen berichtigt) startet der Server ohne Probleme.
Wenn du den Client nicht startest, und nur per „python3 sh-server.py“ startest, kommt dann der gleiche Fehler?
Btw. ich habe nicht(!) das image genutzt sondern eine aktuelle raspbian-lite Image.
Hmm, wie startest du die Software? Mit „python“ oder „python3“?
Du musst „python3“ nutzen.
Ich nutze Python3 also Version 3.4
Komisch, ich habe ein neues raspbian genommen, dort apache, mysql und die python-libs installiert, dann alles per Hand aus dem GitHub gezogen und auf dem Raspberry installiert – und was soll ich sagen, deinen Fehler kann ich nicht nachvollziehen.
Ich hatte zwar ein paar Fehler (fehlende Spalten in DB, Versionsänderung einer python-Lib, etc…) aber die konnte ich alle lösen und danach startet die Software ohne Fehler.
Dein Fehler taucht ja direkt beim Start auf und ich bin ehrlich gesagt noch nicht dahinter gekommen warum ….
Ich hoffe das jemand anders vielleicht weiter weiß?
Hmmm, hast du die komplette Fehlermeldung gepostet oder fehlt da noch ein Teil?
Weil bei mir läuft das Ganze wenn ich es manuell herunterlade und dann in der Tabelle „switches“ das Feld „status“ als Bolean hinzufüge.
Naja, dann müssen noch ein paar ID’s & Passwörter in den Config-Dateien angepasst werden.
Aber danach läuft es in einem ersten Test mit GPIO-Pins.
Deinen Fehler kann ich im Moment nicht nachvollziehen.
Eventuell warten bis die neue Version da ist.
Hallo Christopher,
erstmal großes Lob für das tolle Projekt.
Nun meine Frage, ich habe dein „Demo“-Image installiert, die IP in der jeweiligen config.py eingetragen
und komme nun auf das HTML-Frontend.
Wenn ich jetzt die üpdaten vom März des Jahres einfließen lassen möchte, kopiere ich die jeweiligen Ordner von GitHub auf den Pi
und passe wieder die IPs an. Richtig ?
Gruß Maik
Hallo Christopher,
zuerst einmal: ich muss schon sagen …. TOP, was du bisher geleistet hast!!!
Ich verfolge dein Projekt nun schon einige Monate. Leider ist auch bei mir
der Zeitfaktor das Problem 🙁 … deshalb komme ich sehr schleppend hinterher
und melde mich erst jetzt.
Aber ich möchte bei diesem Projekt mitmachen. Falls du noch Interesse daran
hast?
Dies können wir gerne per email besprechen.
Ich habe dein Projekt installiert. Alles auf einem Pi 3. Client & Server. Kannst du mir sagen, warum immer die Meldung Server offline kommt, wenn ich den Button Server Neustart anklicke?
Ich freue mich auf deine Antwort.
Gruß
Andreas
update
hab mal alles geloggt
hier die Ausgabe:
SERVER:
2016-02-10 01:21:37 : smartHome Server startet
2016-02-10 01:21:38 : mySQL ……… Verbindung online
2016-02-10 01:21:48 : TimerSwitch … initialisiert
2016-02-10 01:21:49 : websockets …. System online
2016-02-10 01:21:49 : websockets …. smartHome Queue startet
2016-02-10 01:21:49 : websockets …. ein neuer smartHome-Client wurde in die Queue aufgenommen
2016-02-10 01:23:05 : websockets …. GUI Queue startet
2016-02-10 01:23:05 : websockets …. ein GUI-Client wurde in die Queue aufgenommen
2016-02-10 01:23:28 : websockets …. ! CLIENT connection unexpected closed !
2016-02-10 01:23:30 : websockets …. ein GUI-Client wurde aus der Queue entfernt
CLIENT:
2016-02-10 01:20:44 : System startet
2016-02-10 01:20:44 : mySQL ……… Verbindung online
2016-02-10 01:21:49 : websockets …. asyncio.async
2016-02-10 01:21:49 : websockets …. Queue startet
2016-02-10 01:21:49 : websockets …. consumers.append
2016-02-10 01:24:42 : SYSTEM …….. exit handler triggered
mfg Maik
Hi,
habe nun nach langem Versuchen die GPIO’s zum schalten bekommen.
1. benutze ich nun wiringPi
2. musste ich in der lib_gpio vieles ändern
warum sich 90% der gpio’s mit RPi.GPIO nicht schalten liessen ist mir unklar.
Daher der Umstieg auf WiringPi.
#code
import json
import wiringpi
wiringpi.wiringPiSetupPhys()
class RaspiGPIO:
def __init__(self, switch_id, ip, logging_daemon, queue):
self.switch_id = switch_id
self.ip = ip
self._logging_daemon = logging_daemon
self._queue = queue
#GPIO.setmode(GPIO.BOARD)
self._logging_daemon.info(‚RaspiGPIO ….. initialisiert‘)
@staticmethod
def status(number):
wiringpi.pinMode(int(number), 1)
return wiringpi.digitalRead(int(number))
def set_switch(self, switch_to, arg_a, arg_b, arg_c, arg_d):
wiringpi.pinMode(int(arg_a), 1)
if switch_to == True:
wiringpi.digitalWrite(int(arg_a), 1)
else:
wiringpi.digitalWrite(int(arg_a), 0)
print(
‚RaspiGPIO ..AUS… geschaltet Pin %s , SOLL = %s , IST = %s‘ % (arg_a, switch_to, self.status(arg_a)))
tmp_json = json.dumps([„switch_changed_status“, self.ip, self.switch_id, switch_to])
for consumer in self._queue:
consumer(tmp_json)
self._logging_daemon.info(
‚RaspiGPIO ….. Pin %s , send %s -> SocketServer Warteschlange ‚ % (arg_a, self.status(arg_a)))
#code/
Allerdings gibt es noch weitere Probleme.
1. Schalter lassen sich nicht ohne reboot ändern
2. Zeitschalter lassen sich nicht ohne reboot ändern
das heisst, in der web Oberfläche werden die neuen Werte angezeigt (zb. neue Schaltzeit, neuer Schalter in dem Zeitprogramm, etc…) diese werden aber erst nach einem reboot verwendet.
somit ist die Weboberfläche im Prinzip nutzlos, wenn ich doch jedesmal den Pi neu starten muss.
gibt es dafür einen Grund oder eine Lösung?
mfG Maik
Hi,
habe soeben dein Image aufgespielt!
leider gibt es ein paar Probleme 🙁
1. ich kann keine deutsche Tastatur einstellen, es wird immer das EN layout verwendet.
2. die gpio Ports werden nicht geschaltet (von Hand gehen sie über wiringPi)
nun meine Fragen:
1. wieso kann ich mit “ sudo raspi-config“ nicht das Tastaturlayout ändern? Ich kann es zwar auswählen, aber anscheinend werden diese Einstellungen nicht gespeichert. Lösung??
2. Kann es sein das die Client – Server Einstellungen falsch sind?
SERVER:
# logging
# server-ip
SERVER_IP =“192.168.2.33″
SERVER_CLIENTS_PORT = 5500
SERVER_GUI_PORT = 5505
#mysql-server
MYSQL_HOST = „127.0.0.1“
MYSQL_PORT = 3306
MYSQLDB = „smartHome“
MYSQL_USER = „root“
MYSQL_PW = „raspberry“
CLIENT:
# logging
# client-ip
DEVICE_IP = „192.168.2.33“
# server-ip
SERVER_IP =“192.168.2.33″
SERVER_CLIENTS_PORT = 5500
#mysql-server
MYSQL_HOST = „127.0.0.1“
MYSQL_PORT = 3306
MYSQLDB = „smartHome“
MYSQL_USER = „root“
MYSQL_PW = „raspberry“
mfg MAIK
Hallo,
mir gefällt das Projekt. Ich bin aktuell dabei meine Poolsteuerung aufzubauen. Ich habe 2 Pi und ein NAS im Einsatz.
Der SQL Server sowie Webserver läuft auf dem NAS und funktioniert auch.
Der Server läuft auf dem NAS in Docker mit Debian und allen notwendigen Erweiterungen wie von Dir beschrieben. Bei der Ausführung kommt aber jetzt folgende Fehlermeldung. Hat Du ggf. eine Idee?
File „/opt/server/sh-server.py“, line 11, in
from lib_timerswitch import TimerSwitch
File „/opt/server/lib_timerswitch.py“, line 1, in
from apscheduler.schedulers.asyncio import AsyncIOScheduler
File „/usr/local/lib/python3.4/dist-packages/apscheduler/__init__.py“, line 3, in
version_info = tuple(int(x) if x.isdigit() else x for x in parsed_version.public.split(‚.‘))
AttributeError: ‚tuple‘ object has no attribute ‚public‘
Gruss Lars
Auch bei dir Entschuldigung für die verspätete Antwort und danke für das Lob 🙂
Die Trennung von server und Datenbank auf verschiedenen System sollte keine Probleme machen, dafür habe ich das system ja extra entsprechend flexibel gestaltet.
Endlich mal jemand der dafür sogar einen praktischen Einsatzzweck hat (die meisten würden das System wahrscheinlich auf einem Gerät betreiben, also server,client, datenbank und webfrontend auf einem PC).
Deinen Fehler habe ich bisher noch nicht zu Gesicht bekommen, hmm.
Kann es sein das du nicht den gesamten Fehlercode gepostet hast?
Ich habe das Gefühl das da noch 2-3 Zeilen fehlen.
Am besten in der config.py des Servers mal die Logging-Ausgabe für die Console einschalten und dann „per Hand“ starten (also nicht über init.d).
Der Fehler scheint in dem „apscheduler“-Code zu sein, das kann aber eigentlich nicht sein.
Es dürfte sich eher um einen Folgefehler handeln, dafür müsste ich aber die komplette Fehlermeldung sehen.
Ich werde mir das Ganze heute abend noch einmal anschauen und versuchen den Fehler nachzuvollziehen.
Wenn es dir keine Umstände macht, dann wäre es gut wenn ich einen sql-dump deiner Datenbank bekommen könnte, dazu die genauen Einstellungen in den 2 config.py-Dateien.
Dann kann ich versuchen dein komplettes Setup bei mir nachzubauen.
Achja, welche Version meiner Software nutzt du? Kannst du mir sagen wann du die Software von github geladen hast?
Eventuell gab es in der Zwischenzeit ja eine neue Version.
Ich bleibe an deinem Fehler dran, melde dich doch bitte nochmal wenn du irgendwie mehr Daten zusammen bekommst.
Hallo Christopher,
ich glaube es liegt an der python3.4 Installation so richtig sauber ist die nicht. Der Server läuft aber jetzt ich habe einfach die Inhalte der Datei __init__.py gelöscht. Danach lief alles :).
Version keine Ahnung, im Code kann ich nichts finden.
Ich setzte gerade ein Test PI auf, da mein PI im Keller auch heute schon meine PV-Anlage überwacht und ich hier keine Betriebsunterbrechung möchte. Mir ist daher wichtig, die Installationsschritte von Python und add-ons korrekt zu machen. Mal schauen, ob ich das heute noch hinbekomme.
Gruss Lars
Server sowie Clients laufen.
Es funktioniert aber nicht
Anbei Server log
root@FHEM:/opt/server# 2016-04-15 15:07:36 : smartHome Server startet
2016-04-15 15:07:36 : mySQL ……… Verbindung online
2016-04-15 15:07:36 : Timerswitch … add_job „test“ (id = 15)
2016-04-15 15:07:36 : Timerswitch … self._scheduler.add_job(, date, args=[test, 15, True, None], id=15off, {‚run_date‘: datetime.datetime(2016, 4, 15, 17, 4)}
2016-04-15 15:07:36 : TimerSwitch … initialisiert
2016-04-15 15:07:36 : websockets …. System online
2016-04-15 15:08:11 : websockets …. smartHome Queue startet
2016-04-15 15:08:11 : websockets …. ein neuer smartHome-Client wurde in die Queue aufgenommen
sowie Client log
root@raspberrypi:/opt/clients# 2016-04-15 17:08:11 : System startet
2016-04-15 17:08:11 : mySQL ……… Verbindung online
2016-04-15 17:08:11 : get_switches… Pumpe id=13 (raspi_gpio)
2016-04-15 17:08:11 : RaspiGPIO ….. initialisiert
2016-04-15 17:08:11 : websockets …. asyncio.async
2016-04-15 17:08:11 : websockets …. Queue startet
2016-04-15 17:08:11 : websockets …. consumers.append
Eine Ahnung?
Danke
Gruss Lars
So, jetzt läuft alles, im update_status.php hast du Deine feste Server IP hinterlegt. Sollte auf die generelle Config geändert werden. Darum hat es bei mir mit der Websocketverbindung nicht geklappt.
Funktionieren bei Dir die Sensoren?
Gruss
lars
Hallo,
Erstmal großes Lob ich finde das super wie es gemacht worden ist.
Da ich ein Neuling bin habe ich eine Frage. Meine frage ist, wo muss ich die IP Adressen ändern und wie?
Wäre nett wenn mir da wer helfen könnte.
LG Markus
Du musst die IP-Adressen in „/smartHome/server/config.py“ und in „/smartHome/client/config.py“ ändern.
Der Pfad kann auch anders sein, je nachdem wo du die Skripte abgespeichert hast.
Obiges Beispiel bezieht sich auf mein demoImage.
Die Änderungen machst du dann mit einem Editor deiner Wahl über die Kommandozeile.
Zum anderen musst du im html-frontend unter „Einstellungen -> Allgemein“ die IP des Clients anpassen.
Welche IP wohin kommt hängt von 2 Faktoren ab:
1. Läuft die Server-Software, die Client-Software, die mysql-Datenbank und das html-frontend auf dem gleichen Rechner?
2. Welche Version der Software nutzt du? Mein demoImage oder hast du dir die neuste Version (2 Tage alt) bei github geladen?
Hallo,
ich benötige für mein Projekt ein ähnliches Programm. Ich hoffe ihr könnt mir ein paar Tipps geben.
Folgender Aufbau:
Raspberry Pi 2 mit 2 16-Kanal Relay Boards angeschlossen über I2C.
Die Relays steuern Jalousien und Steckdosen.
Zur Steuerung habe ich ein Programm in VB.NET und Android geschrieben.
Anfragen gehen auf den Raspberry Pi über ein WebSocket Server ein und werden bearbeitet.
Meine Frage:
Ist es möglich diese Zeitschaltuhr so umzubauen das ich nur den Teil verwende wo die Daten aus der Datenbank importiert werden und diese Sachen durchgeführt werden? Die Datenbank steht schon zur Verfügung.
Hoffe ich konnte meine Frage eindeutig verfassen bei Fragen bitte melden.
Sollte möglich sein, sofern die Datenbank die du nutzt über python ansprechbar ist.
Ist halt eine Menge Arbeit, da du die Datenbank-Felder im server & client anpassen musst.
Hallo Christopher,
Vielen Dank für Dein Upgrade.
Ich habe es jetzt versucht zu installieren. Dazu einen kleinen Hinweis und zwei Fragen:
Bei Punkt 3 muss es heißen config.py und nicht config.php. Dies war der klein Hinweis. Jetzt die Fragen:
Bei mir erhalte ich zwei Warnmeldungen, wenn ich die Server- und Client-Software zum Runlevel dazufügen möchte:
insserv: warning: script ‚client-startup.sh‘ missing LSB tags and overrides
insserv: warning: script ’server-startup.sh‘ missing LSB tags and overrides
Woran kann das liegen? Ich bin Linux-Laie und habe leider null Plan. (Ich habe das neu Jessie-Lite Image vom 9.2.2016 benutzt)
Unter Punkt 9 schreibst Du, dass man die Libs in die Ordner /sourcecode-client und /sourcecode-server kopieren soll. Muss ich die Ordner unter dem root-Verzeichnis neu anlegen?
Gruß
Frank
Hallo,
freut mich das du dazu gekommen bist.
Erst mal danke für den Hinweis.
Zu der Frage:
Die Meldung kannst du ignorieren, soweit ich weiß sagt das nur aus das das Init-Skript nicht LSB-konform ist.
Es fehlen wohl diverse Sachen, trotzdem funktioniert es.
Kommt bei mir auch und ich ignoriere es einfach.
Zu Punkt 9:
Im Prinzip ist es komplett egal WO du die 2 x Skripte speicherst.
Wichtig ist nur das du sie in verschiedenen Ordner speicherst und dann den Pfad in den init-Skripten einträgst.
Ich speichere die Skripte nicht unter dem root-Verzeichnis, sondern direkt im Hauptverzeichnis.
Der Befehl „mkdir /sourcecode-client“ ist dein Freund. Das „/“ am Anfang zeigt an das sich das Verzeichnis im Hauptverzeichnis befindet.
Du kannst es auch im root-Verzeichnis anlegen, dann musst du nur in den init-Skripten „/root/sourcecode-client/sh-client.py“ (entsprechend für den server auch) angeben.
Mittlerweile lege ich im Hauptverzeichnis ein Hauptordner „/smartHome“ an und darunter „/smartHome/server“ und „/smartHome/client“.
Erscheint mir logischer.
Abgesehen davon laufen bei mir im Produktiv-Betrieb beide Skripte auf unterschiedlichen Rechnern.
Ich hoffe ich kann dir mit meiner Antwort weiterhelfen.
Und melde dich wenn es nicht klappt, aber bitte auch wenn es klappt 🙂
PS: In 4-5 Tagen kommt ein Update für das frontend, damit wird es mehrsprachig.
Erstmal nur englisch, andere Sprachen können aber auch leicht eingefügt werden.
Bitte halten Sie mich auf dem laufenden.
Werde am Wochenende den pi aufsetzen und nach Anleitung vorgehen.
Vielen Dank jetzt schon mal für die vorbildliche Anleitung
LG Gerd