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



## Jannes1987 (19 April 2013)

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


----------



## Mobi (26 April 2013)

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.


----------



## Jannes1987 (29 April 2013)

Mobi schrieb:


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


----------



## wolder (29 April 2013)

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


----------



## Jonny Wire (20 Juni 2013)

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?!


```
$(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!


----------



## Jannes1987 (20 Juni 2013)

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


----------



## Jonny Wire (20 Juni 2013)

Soweit verstanden 

Aber was bewirken dann die Zeilen

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


bzw.

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


----------



## Thomas_v2.1 (20 Juni 2013)

Jonny Wire schrieb:


> Aber was bewirken dann die Zeilen
> 
> ```
> $(document).ready(function(){
> ...



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.


----------



## Jonny Wire (20 Juni 2013)

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.


----------



## Thomas_v2.1 (20 Juni 2013)

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.


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

```
<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 ;-)


----------



## UniMog (20 Juni 2013)

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.


----------



## Mobi (20 Juni 2013)

Thomas_v2.1 schrieb:


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


----------



## Jonny Wire (21 Juni 2013)

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?!

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


----------



## Thomas_v2.1 (21 Juni 2013)

Jonny Wire schrieb:


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


```
$(".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.


----------



## Mobi (21 Juni 2013)

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?


----------



## Thomas_v2.1 (21 Juni 2013)

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.


----------



## Mobi (21 Juni 2013)

Die Inputbox kannste rausnehmen mit

```
$(".ui-slider-input").hide();
```


----------



## Jannes1987 (25 Juli 2013)

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


----------



## ml@bulme.at (21 August 2013)

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


----------



## Jannes1987 (2 September 2013)

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: "" } );

});_


----------



## Jochen Kühner (2 September 2013)

Mobi schrieb:


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



Ich verstehe nicht was du damit sagen willst! Ajax nutzt doch XMLHttpRequest! (http://de.wikipedia.org/wiki/XMLHttpRequest) ("XMLHttpRequest kann aus JavaScript, JScript und VBScript heraus verwendet werden und bildet einen Grundbestandteil der Ajax-Technik")


----------



## peet88 (18 November 2013)

Hallo zusammen,
ich Programmiere eine S7 1214C für eine Haussteuerung die für einen Freund sein soll. Nun möchte ich das für ihn auch visualisieren, leider habe ich mit html oder java noch keine Erfahrung. 
Bei der suche bin ich dann auf das gepostete Projekt von Jannes1987 gestoßen und hoffe ich darf das als Grundlage nehmen. Nun möchte ich diese webpage für mein Projekt anpassen / erweitern. Leider komme ich auch nach langer Suche bei ich denke simplen dingen nicht weiter. Ich habe mir das von der Oberfläche schon einwenig zurecht gebastelt, doch hakt es bei den variablen. Wie / was muss ich ändern um eine Variable für meine Bedürfnisse anzupassen? 
Z.B. habe ich den Button "Alles aus" in "Rollladen Zentral auf" umgeschrieben und auch oben in <!-- AWP_In_Variable Name='"W_Rollladen_Zentral_auf"' --> umgeschrieben. 
In der S7 hab ich diese Variable als M100.0 deklariert.

Schon beim laden auf die S7 laufen Warnungen im Info Fenster auf wie diverse Variablen nicht gefunden und da taucht immer noch die Variable "Alles aus" nicht gefunden auf. 

Ich weiss man kann nicht einfach ein Projekt rein kopieren aber ich will mir das so einfach wie möglich machen weil das komplettes Neuland für mich ist.

Ich bin zwar doof aber extrem lernfähig. 

Lg Peter


----------



## Jannes1987 (18 November 2013)

Hi peet88,
Wenn du eine Variable austauscht musst du diese auch in allen Dateien umbenennen. (my.js, Wohnung. html) Außerdem kannst du die Variable dann in der Steuerung/Variablentabelle entweder löschen oder durch die neue ersetzen. Um es einfacher zu machen durchsuch doch my.js und Wohnung.html nach "Alles_Aus" und jedes mal wenn du dies findest ersetzt es durch deine Variable. 

Danach musst du natürlich noch die Web_Dbs neu generieren (Eigenschafter der CPU, Web, Web_DBs löschen, dann neu gernerieren).

Jetzt sollte es funktionieren!

LG


----------



## peet88 (19 November 2013)

Danke für deine schnelle Antwort.
In der Wohnung.html hatte ich es überall umbenannt, in der my.js ist nichts mit "Alles_Aus" zu finden. Wird es da anders gehandhabt weil das nur ein Button ist und kein Slider?
Zu Testzwecken habe ich eine vorhandene Variable "W_Wohnzimmer_Deckenlicht_1" von deinem Wohnungsprojekt in meinem Projekt der S7 Variablentabelle deklariert aber da tut sich nichts wenn ich das von der Webseite ansteuere!?
In der Gerätekonfiguration wähle ich die entsprechende html aus und generiere neue Dbs nachdem ich bestätige das die vorhanden gelöscht sollen.

Was mache ich falsch? Habe schon so viele Stunden mit diesem Thema verbracht. Es wäre mein Traum wenn das irgendwie klappen würde. Habe die Siemens Dokumentation schon durch und auch das Beispielprojekt getestet aber das hilft mir alles nicht weiter.


----------



## Jannes1987 (20 November 2013)

Bist du dir sicher dass die Variablen nicht schalten? Ich habe diese So Programmiert, dass sie sich nach 300ms automatisch zurück setzen weil ich ein Stromstoßrelay ansteuer. Vielleicht mal das gesamte Programm löschen, und nur noch die Variablen beobachten. 
Und du hast recht. der Alles_Aus ist nicht in der js weil er kein schieberegler ist, sondern ein Button.


----------



## peet88 (29 Dezember 2013)

Ok ich habe das hinbekommen, ich musste nur die nicht benutzten Variablen entfernen dann klappte das wunderbar. 
Allerdings stehe ich jetzt vor einem neuen Problem und komme nicht weiter. Denn meine HTML Datei ist zu groß, wenn ich die in die CPU laden möchte dann kommt die Fehlermeldung das das zu groß sei.
Ich habe meine HTML Datei schon komprimieren lassen, ist immer noch zu groß.
Dann hab ich mehrere HTML Dateien angelegt und diese verlinkt (für jedes Zimmer eine Datei), das konnte ich dann hochladen allerdings kann ich dann wieder nichts steuern und das ist dann extrem langsam.

Hat jemand ein Tipp für mich?

Laut Recherchen sollte die 1200 mit V12 das Automatisch in mehreren DBs aufteilen können, aber irgendwie haut das nicht hin. Aktuelle Firmware habe ich aufgespielt.

Vielen Dank im Voraus...


----------



## PENT89 (17 Februar 2018)

Hallo Zusammen,

erstmal großes lob an Jannes ich find es echt gut das er das Programm gepostet hat.
Ich weiß der threat ist schon recht alt aber ich versuche es trotzdem.

Ich hab jetzt ein bisschen Zeit mich mal mit dem Webserver zu beschäftigen und die Programmierung ist genau das wonach ich gesucht habe. Allerdings habe ich fast garkeine HTML Kenntnisse.
Ich hab versucht das Programm ein wenig für meine Bedürfnisse umzuschreiben funktioniert auch soweit alles gut. Allerdings fehlt mir ein einfacher Button der nur einen kurzen impuls rausgibt z.b für eine Jalusie. Quasi einen Button für heben einen für Heben einen für Senken. Was müsste ich dafür tun?

Programmbeispiele wären super!

Danke für eure Hilfe!


----------



## Waldemar1 (10 Oktober 2019)

Hallo ,habe  die Seitevon Motzek (2014)ausprobiert ,muss dazu sagen ich habe die etwas angepasst und bekommenur teilweise Rückmeldungen bei der Alarmanlage ,die andere Rückmeldungen sindnicht Programmiert .Die Unscharf Rückmeldung funktioniert ohne Probleme, aberdie "W_A_Scharf_unscharf_mit_BWM" funktioniert nicht. wenn man es per"Hand" einschaltet und dann auf den Batten klickt unscharf schalten Dankommt die Rückmeldung . Könnte vielleichtjemand drüber schauen? Ich hatte davordie Seite aus dem Forum von Motzek (2013)auch etwas angepasst aber die funktioniertganz guteinzige Nachteil der PC aufwelchem die Seite ausgeführt wird mussim Internet sein.


----------



## Waldemar1 (10 Oktober 2019)

Entschuldigung beim Text kopieren sind Schreibfehler aufgetreten.
Hallo ,habe  die Seite von Motzek (2014)ausprobiert ,muss dazu sagen ich habe die etwas angepasst und bekomme nur teilweise Rückmeldungen bei der Alarmanlage ,die andere Rückmeldungen sind nicht Programmiert .Die Unscharf Rückmeldung funktioniert ohne Probleme, aber die "W_A_Scharf_unscharf_mit_BWM" funktioniert nicht. wenn man es per "Hand" einschaltet und dann auf den Batten klickt unscharf schalten dann kommt die Rückmeldung . Könnte vielleicht jemand drüber schauen? Ich hatte davor die Seite aus dem Forum von Motzek (2013) auch etwas angepasst aber die funktioniert ganz gut einzige Nachteil der PC auf welchem die Seiteausgeführt wird muss im Internet sein.


----------

