smartHome Eigenbau – Upgrade der Zeitschaltuhr auf Version 2.0

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

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.

  1. Als erstes laden wir die Software von github runter (alle Ordner).
  2. 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.
  3. 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.
  4. 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;“.
  5. 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.
  6. 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.
  7. 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.
  8. 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.
  9. 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“.
  10. 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.

34 Gedanken zu „smartHome Eigenbau – Upgrade der Zeitschaltuhr auf Version 2.0“

  1. 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

    Antworten
  2. 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

    Antworten
  3. 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?

    Antworten
  4. 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

    Antworten
  5. 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

    Antworten
    • Verschollen ist ein gutes Wort.
      Aufgegeben habe ich das ganze noch nicht, aber aktuell geht das Geld verdienen leider vor.

      Antworten
  6. 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

    Antworten
    • 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.

      Antworten
      • 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.

  7. 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

    Antworten
  8. 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

    Antworten
  9. 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

    Antworten
    • 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

      Antworten
  10. 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

    Antworten
  11. 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

    Antworten
    • 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.

      Antworten
      • 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

  12. 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

    Antworten
    • 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?

      Antworten
  13. 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.

    Antworten
    • 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.

      Antworten
  14. 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

    Antworten
    • 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.

      Antworten
  15. 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

    Antworten

Schreibe einen Kommentar