Markisensteuerung

Hallo,

ich habe hier mal mein erstes selbst erstelltes Scribt vorstellen. Es soll folgende Funktion erfüllen: Wenn es regnet, oder der Wind stärker als 10km/h oder der Dämmerungsschalter auf „true“ geht soll die Markise einfahren.

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Markise_Einfahren_BeiRegen_Wind_Daemmerung.ips.php
Trigger  :  Regen_Wind_Dämmerung
Interval : 
*/
 //Hole Daemmerungsschalter_Kanal_1 Wert
$Daemmerungsschalter_Kanal_1=GetValueBoolean("Daemmerungsschalter_Kanal_1");

//Hole KS_300_Windgeschwindigkeit
$Wind=GetValueFloat("KS300_Windgeschwindigkeit");

//Hole KS_300_Es_regnet
$Regen=GetValueBoolean("KS300_Es_regnet");

//Markise einfahren
if ("Daemerungsschalter_Kanal_1" == true);
if ("Regen" == true);
if ("Wind" >= 10); {
    SetValueBoolean("Markisensteuerung", true);
   }


?>

Meine Fragen hierzu:

  1. Ist das Scribt richtig erstellt?
  2. Kann man es noch bessser oder richtiger machen?
  3. Welche Funktion erfüllen diese Klammern „{}“ ?, ich habe Sie in anderen Scribten gesehen, aber nirgendwo eine Beschreibung gefunden was sie bewirken.

Gruß Klaus

Hallo Klaus…,

ich fange dann mal mit der Beantwortung der 3. Frage an.
Die {} begrenzen Funktionsblöcke die z.B. eine Schleife (while, for, main) umfassen, bzw. wie auch in deinem Falle eine Bedingung (if-Abfrage).

z.B.

int plus_eins(int var_a)
{
var_a++;
return var_a;
}

hier begrenzen die Klammen den Funktionsblock der Unterfunktion „plus_eins“
der aufruf erfolgt mit: plus_eins(Kontostand);
damit würde die Variable „Kontostand“ um 1 erhöht.

bei if-Abfragen sieht das dann so aus

if(Kontostand < 0)
{
printf(„Hilfe ich bin pleite!“);
}

hierzu ein paar wichtige Dinge.
Du siehst KEIN Semikolon hinter der IF-Abfrage. Das ist richtig und wichtig.Alles was zwischen den {} steht gehört zu if-Funktion und wird abgearbeitet wenn Kontostand kleiner 0 ist.
Die Klammern sind erforderlich wenn mehr als zwei Zeilen abgearbeitet werden müssen. Bei einer Zeile kann man die Klammern weglassen, das wist du vielleicht mal bei Beispielscripen sehen. Sieht dann so aus.

if(Kontostand < 0)
printf(„Hilfe ich bin pleite!“);

Einen Untzerschied macht also:

if(Kontostand < 0)
{
printf(„Hilfe ich bin pleite!“);
Kredit_aufnehmen();
}

und


if(Kontostand < 0)
printf(„Hilfe ich bin pleite!“);
Kredit_aufnehmen();

ohne Klammen wird die Funktion „Kredit_aufnehmen“ IMMER aufgerufen, egal was die If-Bedingung bringt. Hierbei sind die Klammer also wichtig.

zur 2. Frage:
Besser kann man meistens alles irgendwie noch machen - aber richtiger auf jeden Fall.

zur 1.Frage:


<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File     : Markise_Einfahren_BeiRegen_Wind_Daemmerung.ips.php
Trigger  :  Regen_Wind_Dämmerung
Interval :
*/
//Hole Daemmerungsschalter_Kanal_1 Wert
$DS_Ch1=GetValueBoolean("Daemmerungsschalter_Kanal_1");

//Hole KS_300_Windgeschwindigkeit
$Wind=GetValueFloat("KS300_Windgeschwindigkeit");

//Hole KS_300_Es_regnet
$Regen=GetValueBoolean("KS300_Es_regnet");

//Markise einfahren
if ($DS_Ch1 == true || $Regen==true || $Wind >= 10)
{
    SetValueBoolean("Markisensteuerung", true);
}
?> 

kurze Erklärung zu der Zeile

if ($DS_Ch1 == true || $Regen==true || $Wind >= 10)

du hast die Werte von IPS in die Variablen geholt, die werden dann in dieser Zeile geprüft (If-Abfrage).
die || bedeuten ein LOGISCHES ODER.
Also: WENN DS_Ch1 wahr ODER Regen wahr ODER Wind größer gleich 10 DANN
setze IPS Variable „Markiesensteuerung“ auf wahr.
Hier müsstest du dann noch deine Mariese auch ansteuern. Hier setzt du ja nur die Variable bisher auf True.

Hallo Retiarius,

vielen Dank für deine Hilfe. Was muß ich dann noch eingeben um die Markise anzusteuern?

Gruß Klaus

Hallo,

und das nochmal etwas kuerzer:

if ($DS_Ch1 || $Regen || $Wind >= 10)

und zur Erklaerung: Eine IF Abfrage wertet immer eine Bedingung aus, ob sie TRUE oder False ist. Wenn man bereits eine Boolean Variable benutzt, kann sie nur TRUE / FALSE annehmen. Damit ist die IF Abfrage nochmal etwas schneller - wenn man das ueberhaupt messen kann.

Gruss Torro

genau so - ob die Abfrage damit schneller wird weiß ich nicht. Kommt wohl auf den Compiler oder Interpreter an. Ich würde auf das Zero-Flag prüfen und dann ist egal ob true oder 123 drin steht. Egal.

Ich schreibe auch eher:
if(variable) oder negiert abgefragt if(!variable)
übersichtlicher (einfach zu verstehen) ist halt

  1. if(variable == true) oder
  2. if(variable == false)
  3. if(variable != true)
    wobei 2 und 3 das gleiche machen.

Als Neueinsteiger beim Programmieren muss man halt seinen Weg finden.
Die Feinheiten stellen sich mit ansteigen der Erfahrung ein.

Ein Vorteil welches hier im Forum ein riesen Pluspunkt ist. Es gibt alle möglichen Kompetenzen von Programmieren. Einige können viel, andere weniger. Aber du bekommst immer Hilfe in deinem Level. Du hast es hier nicht nur mit „Fachidioten“ zu tun, die sich oft gar nicht mehr vorstellen können wie es ist wenn man mal neu mit dem Stoff anfängt.

noch zu deiner Frage wie man die Markiese ansteuert:
Das kommt vorallem erstmal auf deine Hardware an! . Hast du eine FS20MS, dann geht das so:


FS20_SetPosition(MARKIESEN_INSTANZ,Position);

wobei die Position in % (0-eingefahren, 100-ausgefahren) ist.

Hallo Retiarius,

danke für deinen Tip, aber irgendwie funktioniert das nicht bei mir.
Ich sag dir mal was ich hab: Ich hab eine FS20MS die ich über einen FS20 4 Kanal UP Schalter bediene.
In IPS habe ich die Variable für FS20MS als integer angelegt, desweiteren habe ich noch eine FS20TX als boolean angelegt um in der IPS zu sehen, welche Tastbefehle (True oder False) vom FS20 UP Sender kamen.

Wenn ich jetzt das hier besprochene scribt ausführe und die FS20TX als „SETVALUEBOOLEAN“ setze wechselt dieser entsprechend von false auf true;
setze ich aber „SETPOSITION“ für FS20MS ein ändert sich der Value Wert nicht, egal welchen Positionswert im scribt eingebe.

Hast du noch eine Idee an was es liegen kann???

Viele Grüße Klaus

Als erstes musst du mal gucken ob deine Konfiguration in IPS richtig ist.

Du musst ein FS20TX Device anlegen, mit der FHZ verbinden (Pfeil richtung FHZ) und dann die Hardware einlernen. Wenn du nun mit dem FS20TX Modul die Markiese bewegen kannst ist das schlimmste geschafft. Du brauchst der FS20TX Instanz KEINE Variable zuzuweisen. Jetzt legst du ein FS20MS Device an und gibst darin als FS20TX Device das Device an, welches mit der Markiesensteuerung verknüpft ist.
nun kannst du über das FS20MS die Markiese steuern „Drive up“ „Drive down“. In dieser Instanz ordnest du auch eine Integer-Variable zu - diese zeigt dann die aktuelle Position deiner Markiese. Achtung - die Psoition stimmt nur so lange man die Markiese über IPS steuert. Bedient man sie von Hand passt die Position nicht mehr und man muss beim komplett raus oder komplatt rein mal die Position referenzieren.
Mit den beiden Knöpfen „start Measure up“ und „Start Measure Down“ kannst du nun die Zeiten für Rein Raus usw. festlegen. Damit weiß IPS dann, wie lange der Motor bewegt werden muss, um die Markiese ganz aus- bzw. einzufahren.

Wenn du das alles gemacht hast sollte der Befehl:
FS20_SetPosition(INSTANZ,POSITION);
ohne Probleme funktionieren. Die Variable der Position wird sich dann auch dementsprechend verändern. Du benötigst kein extra SetValue-Befehl!

Hallo eksch,

mit dem FS20 Windsensor für die Markiese wäre ich vorsichtig, da es oft etwas länger dauert bis die Werte aktualisiert werden.

//Hole KS_300_Windgeschwindigkeit
$Wind=GetValueFloat(„KS300_Windgeschwindigkeit“);

der Wind kann dann für den Markiesenschutz zu spät erkannt werden ! :eek:

@retiarius

Hallo ,

danke nochmal für deine Tips, aber das habe ich alles bereits durchgeführt. Das Problem das ich habe ist folgendes, wenn ich die Markise über einen Wandtaster ausfahre und ein Ereignis (Regen, Dämmerung oder auch Wind ) tritte ein, wird das scribt ausgeführt, aber solange die Variable der FS20MS (Markisenposition) sich auf Null befindet, wird kein Befehl zum einfahren ausgegeben. Es ändert sich in der Variablenansicht nur der ausführungszeitpunkt wann die FS20MS Variable wieder auf „0“ gesetzt wurde.
Hast du oder auch ein andere im Forum noch eine Idee wie ich dies lösen kann.

@ewo

Hallo,
das Problem kenn ich auch, aber dafür bin ich auch noch auf der Suche nach einer Lösung. Für Tips und Ratschläge bin ich jederzeit dankbar.

Viele Güße Klaus

Hallo,

ich gebt dann auch mein Kommentar mit dazu:

Grundsächlich ist es so, das eine Markiesensteuerung autark laufen soll, d.h., die Grundfunktionen wie ein/ausfahren ohne eine Software ausgeführt werden können.
Stell dir mal vor, du sitzt auf der Terasse, es fängt an zu stürmen, und du kannst deine Markise nicht einfahren, weil IPS/Rechner sich gerade aufgehangen haben.
Für den Windsensor, einen FS20 Windsensor gibt es nicht. Gäbe es so einen dann wäre der auch Direkt Auslöser. Den könnte man sich aber basteln.
Den Windsensor von der KS300 würde ich wirklich nicht für eine Markisensteuerung benutzen, da hier manchmal Minuten vergehen, bis der einen neuen Wert schickt, und da kann es mal schon zu spät sein.

Hast du dir das schon mal angeschaut: FS20AMS unter Bestnr. 68-619-29 bei E*V ?

mfG Franz

Hallo Franz,

meine Markise steuere ich schon ganz autark, ich möchte nur daß eben bei Regen, Wind u. Dämmerung die Markise automatisch via IPS einfährt.
Daß die Windgeschwindigkeit bis zu 155sec. verzögert übertragen wird ist mir schon klar. Aber bis ich was besseres habe möchte ich die Markise gern von der KS300 über IPS einfahren lassen.

Gruß Klaus

Gut, wenn du dir des Risikos bewusst bist !

Ich würde mal sagen, in 95% der Fälle wirst du gut weg kommen und es wird klappen. Da die Stürme wegen Klimawandel aber heftiger werden, dann können 155 Sekunden verdammt lange sein…

mfG Franz

Ich weiss garnicht [Edit]warum es sich so anhört als ob es klaus hier ausgeredet bekommen soll.[/Edit]

Bis jetzt hat er nichts automatisiert. Die KS300 hat er schon. Ist immernoch ne Verbesserung zu vorher und kostet nix extra… Bis du ohne Wetterstation merkst dass es stürmt und die markiese noch ausgefahren ist vergehen sicherlich oft genug mehr als 155 Sekunden. Ausserdem er ja nicht exakt bei der Windgeschwindigkeit erst reagieren wo die markiese längst weggeflogen ist, sondern kann das bequem auch schon ne volle Windstärke (oder mehr) früher tun.

Optimieren kann er dann ja immernoch.

Gruß,

Toni

Also, in 155 sekunden (mehr als 2 Minuten !!) kann ein Wind ohne weiteres sich mehr als verzehnfachen. Wenn du da ein grosses Segel (grosse Markise) hast, dann kann diese Zeit schon als ‚unendlich‘ erscheinen und wenn es eine teure Markise war, kann es schon mal weh tun in der Brieftasche.

Ich sag ja, wenn er sich dieses Riskio bewusst ist, dann ist es ja ok.

Ich weiss garnicht was das gesabbel soll…

Dies ist eine Art von Kommentar, die ich mir von einem Moderator nicht erwarte. Tut mir leid das zu sagen. Wir wollen doch sachlich bleiben.

mfG Franz

Ich kann mich da nur Franz anschließen,

es sollte ein Hinweis sein, dass der Windsensor nicht sofort bei Wind sendet sondern eine gewiße Zeit vergeht. Im Übrigen ist der Kommentar von Tonic1024 wohl nicht angebracht.

Ich weiss garnicht was das gesabbel soll…

Okay, vielleicht hab ich mich im Ton vergriffen, sorry…

Aber ich finde es auch nicht okay ständig alle Themen dicht zu machen bloß weil , ganz allgemein jetzt, einige User eine andere Meinung haben, die sie wehement vertreten, obwohl sie nur bedingt zum Thema passt.

Wenn Klaus dies Projekt ausgeredet bekommt, und danach hören sich hier einige Beiträge an, dann hat niemand was gewonnen und er muss wieterhin in unter zwei Minuten zur Markiese spurten weil die Windstärke sich potentieren könnte. Hast du die Ironie entdeckt?

Wenn dir etwas daran liegt werde ich meinen Beitrag und alle damit referenzierenden löschen. Ich sehe aber (noch) keine Veranlassung.

Gruß,

Toni

BTW: Meine Meinung hat nichts mit meinem Status hier im Forum zu tun und ich denke nicht, dass ich die damit verbundenen mir gegebenen Möglichkeiten jemals missbraucht habe.

Ich finde das schon ein wichtiges Thema, tut mir leid. Und ein Forum ist ja da, seine Meinung zu äussern. Wirst du dafür gerade stehen, wenn seine Markise wegfliegen wird, nur weil er aus dem Forum einen Tip bekam, dass 2 Minuten Verzögerungszeit für einen Windsensor eine akzeptable Zeit ist???
ICH NICHT !! Ich als Fachmann vom Gebiet kann dir sagen, dass wir des Öfteren Markisenantriebe flicken mussten, weil sie nicht mitzeiten eingefahren sind.
Ich habe ein ruhiges Gewissen zu sagen, dass 2 Minuten NICHT akzeptabel sind. 30 Sekunden ist schon fast ein Maximum und da sollte eine Markise schon reagieren. Und dann noch Funk, wo wir sowieso wissen, dass es nicht sehr zuverlässig ist.

Und ich wiederhole es nochmal: Wenn er sich dieses Risikos bewusst ist, kann er es ja tun. Es ist ja seine Markise !

und ausserdem:

ganz allgemein jetzt, einige User eine andere Meinung haben, die sie wehement vertreten

Ein Forum ist eben laut Definition ein Ort, wo Leute diskutieren können, auch wenn sie anderer Meinung sind. In unserem konkreten Fall: Hinweise auf das Sicherheitsrisiko ! Und das ist eben MEINE Meinung und die werde ich auch nicht ändern - SCHLUSSPUNKT -

mfG Franz

Und meine Meinung ist nicht minder äußerungswürdig. Das ist kein Grund die Stimme (Schrift) zu erheben.

Ja, zum vierten mal innerhalb von zwei Stunden. Darum ja mein Kommentar. Wollen wir jetzt wieder zum Topic kommen, bitte…

Toni

Hallo Jungs,

Ball flach halten, mein eigentliches Problem, welches noch nicht gelöst ist, ist warum IPS kein Einfahrbefehl absetzt, wenn sich z.B. der Dämmerungsschalter auf true ändert.

Vielleicht habt ihr dazu noch einen Tip.

Viele Grüße Klaus

Wird das Skript überhaupt durchlaufen, wenn eines dieser Events auftritt?
Hast du bei ‚Events‘ die Variablen auch eingetragen, die das Skript triggern sollen ?

Ausserdem, ist es nicht so dass bei dem Dämmerungsschalter die Variable nicht auf True bleibt, wenn der einmal geschaltet hat. Die muss man doch wieder manuell zurücksetzen. Oder war das der Regensensor? Da könnte der Hacken liegen.

mfG Franz