Wohnungs-/Hausautomatisierung mit Hilfe des Webservers der S7-1200

Jannes1987

Level-1
Beiträge
17
Reaktionspunkte
14
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich bin neu hier im Forum und möchte meine Erfahrungen und Lösungen mit euch teilen. Ich habe dieses Beispielprojekt auch schon im Siemensforum gepostet, möchte es euch aber nicht vorenthalten.

Ich habe mir eine Wohnung gekauft. Im Zeitalter der Smartphones und Tablets möchte ich natürlich mein Licht, bzw meine Heizung über solche Geräte steuern. Da es sich bei der Wohnung um ein Neubau handelt, hatte ich die Möglichkeit an der Elektroinstallation noch Veränderungen vorzunehmen.
Ich komme aus der S7-Welt und habe mich entschlossen eine S7-1200 für die Automatisierung zu benutzen. Diese hat einen Webserver integriert, auf dem man "anwenderdefinierte Webseiten" ablegen kann. Über diese Webseite lassen sich dann z.B. über das Smartphone Variablen in der S7 steuern und beobachten.

Die Aufgabe: Ich möchte Sowohl über die Taster in der Wand, als auch über mein IPhone und IPad das Licht, die Steckdosen und die Heizung in meiner Wohnung steuern können.

Die Hardware: Eingesetzt wird eine S71214C (DC/DC/DC); 1x16DI; 2x8DO; 1x4AI (RTD).
Die Analogkarten und die PT100 habe ich noch nicht, deswegen konnte ich den Teil mit der Heizungssteuerung noch nicht testen.

Die Programmierung der S7: Die gesamte Programmierung habe ich hier nicht hochgeladen. Ich habe beispielweise den Code für die Ansteuerung von einer Licht-Stelle und die Ansteuerung von der Heizung in einem Raum hochgeladen. Der Rest ist ja nur Strg+C --> Strg+V und die Variablennamen abändern.

Der Webserver: Der Webserver wird in HTML geschrieben. hier habe ich mir Hilfe geholt, da ich mich nicht so gut mit HTML auskenne. Der gesamte Code liegt im Anhang.

Admin: Der Webserver meldet sich automatisch als "admin" mit dem Kennwort "" an. Dafür muss in der CPU "kein Schutz" eingestellt werden. Somit umgehe ich dass man bei jedem Aufruf des Webservers erst durch das Siemens Menü zu den anwenderdefinierten Webseiten navigieren muss. Als "admin" muss man aber angemeldet sein, damit man auch Variablen steuern kann.

Slider: Ich habe die Webseite nach den verschiedenen Räumen meiner Wohnung aufgeteilt. Damit ich nicht einen Button für "Licht an" und einen für "Licht aus" einbinden muss, habe die ich IPhone typischen "Slider" verwendet. diese zeigen mir auch gleich welche Licht / welche Steckdose eingeschaltet ist. Um die Sleider verwenden zu können musste eine JQuery Quelle eingebunden werden. Außerdem musste noch ein kleines Java Script geschrieben werden um bei einer Veränderung eines Sliders den Wert an die Steuerung zu senden.

"App like": Wenn man sich die Webseite auf den Homebildschirm eines IOS Gerätes legt, wird beim öffnen der Webseite die obere und untere Zeile von Safari ausgeblendet, so sieht das Ganze aus als wenn es eine App wäre. Um dies noch zu verschönern wurde der Webseite noch ein Icon hinzugefügt, welches dann auf dem Homebildschirm liegt.

Heizung: An der Heizungsregelung konnte ich im Vorwege nichts verändern. Die Heitzung ist eine Fußbodenheizung die über ein Wandthermostat geregelt wird. Die Technik dahinter ist sehr simpel. Man kann an dem "Rädchen" drehen, damit wird die länge eines Bimetalls verändert. Wenn das Bimetall eine bestimmte Temeratur erreicht wird ein Signal an eine seperate Steuerung gegeben. diese weiß nun, dass die gewünschte Temeratur erreicht wurde. Nach dem Einzug werden ich das Thermostat ausbauen, dafür einen PT100 einsetzten, diesen auf die S7 führen und in der Steuerung die eingestellte Temeratur am Webserver mit der Ist-Temperatur vergleichen. Ist die Temeratur erreicht, steuer ich einen digitalen Ausgang an, der auf die seperate Steuerung der Heizung verdrahtet wird.
Im Webserver wurde für jeden Raum ein Schieberegler (einstellbar zwischen 15 und 30 Grad) eingebunden. Beim Verändern des Schiebereglers wird die gewünschte Temperatur an die Steuerung gesendet.
Den Code für die Heizungssteuerung konnte ich leider noch nicht testen, da ich weder den PT100 noch die AI habe.


Die Mehrkosten lagen ca. bei 1500-2000 Euro für den mehraufwand für den Elektriker, der die Leitungen alle an einen zentralen Punkt legen musste, sowie die Steuerung mit IOs.

Wenn ich das ganze in meine Wohnung eingebaut habe, berichte ich gerne wieder. Ich denke aber das ganze sollte im Großen und Ganzen funtionieren.

Im Anhang habe ich das TIA V11 Projekt, den Webserver und ein Paar Screenshots des Webservers angehängt.

Anregungen und Verbesserungsvorschläge nehme ich gerne entgegen.

Gruß Jannes
 

Anhänge

  • Projekt Forum.zip
    1,4 MB · Aufrufe: 887
  • Übersicht.PNG
    Übersicht.PNG
    33,2 KB · Aufrufe: 817
  • Wohnzimmer.PNG
    Wohnzimmer.PNG
    62,4 KB · Aufrufe: 817
Hattest du es schonmal probiert anstatt es über Ajax zumachen, es mit XMLHttpRequest zusenden? Wenn ja ist Ajax besser?
Weil ich mach das über XMLHttpRequest. Dort geht das dann auch über POST- und GET-Anfragen.
Läuft das ganze auch wenn du die Seite auf die S7 packst und die JQuery-Scripte? Weil sonst muss du ja immer eine Verbindung haben zum Internet.
Also bei mir läuft es moment so, dass die JGquery-Scripte auch lokal auf dem Rechner sind, somit brauche ich keine Verbindung zum Netz. Aber ich nutze keine S7, aber das ist ja egal.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hattest du es schonmal probiert anstatt es über Ajax zumachen, es mit XMLHttpRequest zusenden? Wenn ja ist Ajax besser?
Weil ich mach das über XMLHttpRequest. Dort geht das dann auch über POST- und GET-Anfragen.
Läuft das ganze auch wenn du die Seite auf die S7 packst und die JQuery-Scripte? Weil sonst muss du ja immer eine Verbindung haben zum Internet.
Also bei mir läuft es moment so, dass die JGquery-Scripte auch lokal auf dem Rechner sind, somit brauche ich keine Verbindung zum Netz. Aber ich nutze keine S7, aber das ist ja egal.


Also ich habe mir Hilfe bei der Homapage geholt. Wir haben das nur mit Ajax ausprobiert. Ich kann alles auf eine S7 packen (auch die JQuery Quellen). Unter der V11 muss man aber noch die Quellen "stückeln" (da gibt es auf der Siemens Seiten den Befeht dafür) unter der V12 soll es keine Probleme mehr geben, konnte ich aber noch nicht ausprobieren.
 
Der Webserver meldet sich automatisch als "admin" mit dem Kennwort "" an. Dafür muss in der CPU "kein Schutz" eingestellt werden. Somit umgehe ich dass man bei jedem Aufruf des Webservers erst durch das Siemens Menü zu den anwenderdefinierten Webseiten navigieren muss. Als "admin" muss man aber angemeldet sein, damit man auch Variablen steuern kann.

Das ist bisher immer mein Problem gewesen. Ne Lösung hab ich bisher noch nicht gefunden.
Ich werde das mal testen.

Gruß wolder

P.S.: Sehr schick was ihr da gebastelt habt!
 
Hoi,

ich bastle auch gerade an S7-1200 + jQuery.
Leider bin ich in Javascript nicht so fit.
Darum meine Frage: Kannst du deine my.js kurz erklären.
Soweit ich das verstehe und gegoogelt habe fängst du das event von Slider.change ab und "machst dann was" mit der Tempvariable. Aber warum? die Tempvariable (z.B. optWohn_Deckenlicht1On) ist doch in der SPS nirgends deklariert?!

Code:
$(document).ready(function(){
                $(".sliderContainer").change(function(){
                        sentIt(this);
                });

        if(:="M_BOOL1": == 1)
                $("#optWohn_Deckenlicht1On").attr("selected", "selected");

Kann man das Javascriptfile auch für andere Steuerelemente erweitern? Hast du evtl. ne Doku für mich, finde leider nichts dazu.

Danke schon mal!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey,
ne doku habe ich leider nicht...
mit der Anweisung:

if:)="M_BOOL1": == 1)
$("#optWohn_Deckenlicht1On").attr("selected", "selected");


stelle ich nur sicher, dass die Slider auch auf "selected" also AN gehen wenn jemand das Licht über einen Taster in der Wand einschaltet.

Gruß Jannes
 
Soweit verstanden :)

Aber was bewirken dann die Zeilen
Code:
$(document).ready(function(){
                $(".sliderContainer").change(function(){
                        sentIt(this);
                });


bzw.
Code:
function sentIt(c){
        $.ajax({
                type: "POST",
                url: "",
                data: $(c).parents("form").serialize(), // serializes the form's elements.
                success: function(){ console.log("done"); }
        });
}

Danke für deine Hilfe
 
Aber was bewirken dann die Zeilen
Code:
$(document).ready(function(){
                $(".sliderContainer").change(function(){
                        sentIt(this);
                });

Damit wird bei allen Elementen mit der Klasse sliderContainer bei Änderung des Wertes das Ereignis sendIt() ausgelöst.
D.h. wenn du den Slider verschiebst wird die Funktion sendIt() aufgerufen, welche dann den Wert mittels POST an die SPS übermittelt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sorry, dass ich dich so mit Fragen beballere :)

Funktionieren bei dir die slider (Real)?
Hab dein Beispiel gerade nochmal geladen und bin Online drauf gegangen, Werte werden nicht aktualisiert.
 
Ich habe mir das Projekt mal genauer angesehen. Da sind noch einige Dinge mehr die nicht funktionieren.

Mit dem Slider hast du Recht, der kann nicht funktionieren.
Du musst in der Wohnung.html dazu bei allen Slidern den Wert für die Eigenschaft Name ändern.

Code:
<input type="range" name="slider_wohn" id="slider_wohn"  value=":="W_Temp_Wohn":" min="15" max="30" step="0.5" />
in
Code:
<input type="range" name='"W_Temp_Wohn"' id="slider_wohn"  value=":="W_Temp_Wohn":" min="15" max="30" step="0.5" />

Bei name= musst du den Variablennamen schreiben auf den später in der SPS geschrieben werden soll.

Allerdings funktioniert das nicht 100%ig, da bei verschieben des Reglers jede kleine Änderung an die SPS geschrieben wird. Ich habs bei mir zumindest erreicht, dass in der SPS nicht der Wert steht der einem auf der Webseite angezeigt wird.
Auch werden die Daten nur einmalig beim erstmaligen Laden der Seite aus der SPS aktualisiert, das ist ja auch doof wenn sich dort mal was ändert.

Vielleicht hat der Jannes ja noch eine funktionierende Version, denn mit der die er hier gepostet hat wirds zu Hause in der Bude wohl kalt bleiben müssen ;-)
 
Eigentlich schade das es zum erstellen von Web-Seiten nichts vernünftiges innerhalb von TIA gibt......
Die einfachen HTML Editoren sind alle sch...... und was schönes erstellen nimmt viel Zeit in Anspruch.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Auch werden die Daten nur einmalig beim erstmaligen Laden der Seite aus der SPS aktualisiert, das ist ja auch doof wenn sich dort mal was ändert.

Vielleicht hat der Jannes ja noch eine funktionierende Version, denn mit der die er hier gepostet hat wirds zu Hause in der Bude wohl kalt bleiben müssen ;-)
Deshalb frage ich alle 200ms die Variablen ab, die zum anzeigen sind.
 
Ich habe als Workaround einen Übernehmen Button eingebaut.
Problem ist dass das onchange event x-mal getriggert wird und das Javascript es schön fleißig nacheinander abarbeitet. Es müsste eine changed() event geben?!
Code:
      <form action="" method="post">
        <label for="slider">
        <p align="center">Ausgang 1-5:</p>
        </label>
        <input type="range" name='"MW_INTEGER1"' id="slider_int" value=":="W_Temp_Bad":" min="0" max="5" step="1"/>
        <br>
        <input id="button1" type="submit" name='"Flowrate"' value="Übernehmen" onclick="sentIt(slider_int)">
      </form>
 
Ich habe als Workaround einen Übernehmen Button eingebaut.
Problem ist dass das onchange event x-mal getriggert wird und das Javascript es schön fleißig nacheinander abarbeitet. Es müsste eine changed() event geben?!

Der Slider hat einen event namens sliderstop, der ausgelöst wird nachdem der slider nach dem Verschieben losgelassen wird.
http://jquerymobile.com/demos/1.2.0/docs/forms/slider/events.html

Dazu muss man in der document ready Funktion das Event folgendermaßen anlegen:

Code:
$(".sliderContainer").on('slidestop', (function(e){
    sentIt(this);
}));

Dann wird nur einmal an die SPS geschrieben wenn man das Verschieben beendet hat, das klappt schonmal.

Leider funktioniert dann eine direkte Eingabe in das Zahlenfeld nicht mehr, weil dann kein Event mehr ausgelöst wird. Mal gucken ob man das noch irgendwie hinbekommt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Muss das alles in die document ready?
Ich hab meins einfach nacheinander in <script type="text/javascript"> </script>
gepackt.
Wegen der manuellen Eingabe: Was ist wenn man das mit .bind( "change" ... macht?
 
Das change Event wird andauernd aufgerufen, auch während man den Slider verschiebt. Und eben auch wenn einen Wert direkt in die Textbox eingibt. An der event Quelle lässt sich auch nicht erkennen ob es von der Eingabebox oder vom Slider stammt.

Ich weiß nicht ob das zwingend in document ready aufgerufen werden muss, hab das nur so aus dem Beispiel übernommen.
Die onchange Events bei den Auswahlfehlern sind ja direkt im HTML geschrieben. Vielleicht geht das beim Slider nicht, weil der über Javascript erstmal dynamisch zusammengebaut wird.
Das mit dem slidestop funktioniert ja auch, man müsste nur die Textbox mit CSS unsichtbar schalten und den Slider-Wert an anderer Stelle ausgeben lassen.

Wobei ich das mit dem Übernehmen-Button eigentlich genauso schön finde.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So ich bin aus dem Urlaub wieder da. Hier hat sich ja viel getan.
Das mit den Slidern hatte ich schon mal bemerkt, das hatte ich vergessen hier zu posten. Aber im Siemens Forum müsste einen funktionerende Version liegen:

https://www.automation.siemens.com/...tID=444120&Language=de&onlyInternet=False#top

Auf der zweiten Seite ist der Webserver samt Projekt noch mal berichtigt gepostet. Ich hoffe das hilft euch weiter?!

Greetz
 
Hallo Jannes1987,
hast du das mit der automatischen Anmeldung als ADMIN jetzt wirklich realisiert?
In dem ZIP-File find ich da nix (kann aber auch daran liegen, dass ich es als reiner SPS-Programmierer ohne Hochsprachenkenntnisse nur nicht finde?).

LG, Charly
 
Hallo ml@blume

hier ist das realisiert, dass automatisch als "admin" mit dem Passwort "" eingeloggt wird (kein schutz in der CPU eingestellt).

in "my.js":

$(document).ready(function(){
[...]
$.post("/FormLogin", { Login: "admin", Password: "" } );

});
 
Zurück
Oben