1-Wire Relaisbaustein per Script , Zeitsteuerung, Button erstellen

Hallo,

bisher habe ich hier viel anonym gelesen, und durch viel probieren IP Symcon so zurecht gebogen wie ich es haben wollte. Doch jetzt weiß ich mit meinem spärlichen Wissen auch nicht mehr weiter. Also versuchte ich jetzt im Forum mit hoffentlich passenden Suchbegriffen meine Probleme lösen zu können. Nach weiteren 4 Tagen durchsuchen und lesen hab ich jetzt das Handtuch geworfen und traue mich voller Ehrfurcht mal nachzufragen.

Kurze Infos um meine Fragen nachvollziehen zu können…
-> Neubau Stadtvilla

-> ALLES sternförmig verkabelt
—> jede Steckdose
—> Türsensoren
—> Fenstersensoren
—> CAT7 Dosen
—> SAT Dosen
—> Lampen / Leuchten / Lichtvouten / Deckensegel

-> LCN System
—> 6 x SHS
—> 6 x R8H
—> aktuell 1 x DMXH

-> 1-Wire System
—> 1 x 1-Wire Controller 2 von Esera
—> 6 x 1-Wire 8-Fach Digital Eingang von Esera
—> 8 x 1-Wire Relaisbausteine von Denkovi (DS2408)
—> 28 NTC 18B20

Die Einbindung aller Komponenten in IP Symcon verlief einwandfrei. Was mich am meisten reizt, ist die Tatsache das ich in Ip Symcon mit PHP ansetzen kann. Ich arbeite seit 14 Jahren leidenschaftlich gern mit PHP, MySQL, etc.

Nun die konkreten Fragen und meine bisherigen Lösungsansätze…

1.) 1-Wire Relaisbaustein per Script schalten

In der Dokumentation steht dazu der Befehl

OW_SETPIN(Instanz, Pin, Status)

Konkret sieht das bei mir so aus

OW_SetPin(42273, 5, true);

Starte ich das Script bekomme ich folgende Fehlermeldung…

WARNING: Instance #42273 does not exist in /var/lib/symcon/13627.ips.php an line 18

In Zeile 18 steht exakt der o.g. Befehl. Nun dachte ich, dann nehme ich mal die ID vom Contoller, obwohl dies für mich unlogisch schien, da auch dieser ja mehrere Ein- und Ausgänge hat. Natürlich klappte das auch nicht. Dann war ich der Meinung ich müsse die 1-Wire ID benutzen, da nur die ja eindeutig aussagt welches Gerät also Instanz ich ansprechen möchte. Natürlich klappte das auch nicht.

Probiert habe ich auch…

OW_SetPin(21793, 5, true);

jedoch auch ohne Erfolg. Die gleiche Fehlermeldung nur mit der Object ID 21793.

Unter

tail -f /var/log/symcon/logfile.log

wird mir auch nichts angezeigt, was logisch ist, das Script wird ja schon bei der Überprüfung durch den Parser ausgebremst. Was übersehe ich?


2.) Zeitsteuerung

Wie man in der o.g. Grafik sehen kann, mache ich schon viel mit Zeitsteuerungen. Nun habe ich 2 weitere NTC am Vor- und Rücklauf der WP angeschlossen. Ziel ist es, die Warmwasserumwälzpumpe (WWUWP) nicht rund um die Uhr laufen zu lassen, sondern in der Zeit von beispielsweise 5:30 - 9:30 IM INTERVALL von 10 Minuten an und 10 Minuten aus. Mit einem Wochenschaltplan habe ich zwar hinbekommen das diese in der Zeit von beispielsweise 5:30 - 9:30 durchweg läuft. Nun möchte ich es jedoch noch weiter verfeinern. In dieser Zeitspanne soll diese im Intervall von 10 Minuten laufen. Probiert habe ich unter dem Wochenschaltplan noch einen Zyklusplan „anzuhängen“. Das geht jedoch nicht, da ich eine ausführende Variable, also das Relais der WWUWP angeben muss, damit wäre der Wochenschaltplan jedoch wieder unberücksichtigt.

Lässt sich dies wieder nur mit einem Script realisieren? Das tolle ist, das der Wochenschaltplan auch vom Endbenutzer im Frontend editiert werden könnte, daher habe ich all meine Hoffnung darauf gelegt.


3.) Button erstellen

Bitte nicht lachen, ich bin wohl zu blöd einen Button zu erstellen. Laut Doku…

{ "type": "Button", "caption": "An", "onClick": "echo $id;" }

Erstelle ich ein Testscript und kopiere das dort rein und führe es im Frontend aus bekomme ich folgende Fehlermeldung

Parse error: syntax error, unexpected ':' in /var/lib/symcon/scripts/16728.ips.php

Das sieht mir eher nach JSON aus. Wie verwende ich dies in den Scripten? Gibt es da bereits Standardroutinen. (Methoden)

Ziel ist es, zukünftig eine Gruppenschaltung zu realisieren. 8 Rollläden im EG über einen Button zu schließen, wobei alle Einzelbuttons der Rollläden dann auch nach und nach den Status des Rollladen annehmen sollten, also Open oder Close, je nachdem. Zur Zeit sieht dies noch so aus…

<?php
//definitionen
include(IPS_GetScriptFile(36893));
//ausführung
include(IPS_GetScriptFile(57827));
?>

Die Einzelscripte sehen so aus

//script 36893

<?php
//definition jalousien eg
$jalousien = array(
    53857 Rollladen-Essbereich (Busmodule\LCN Module\Rollläden/EG (000, 006)),
    34816 Rollladen-Terassentür (Busmodule\LCN Module\Rollläden/EG (000, 006)),
    21408 Rollladen-Wohnbereich (Busmodule\LCN Module\Rollläden/EG (000, 006)),
    19937 Rollladen-Wohnbereich klein (Busmodule\LCN Module\Rollläden/EG (000, 006)),
    40943 Rollladen-Badezimmer (Busmodule\LCN Module\Rollläden/EG (000, 005)),
    25204 Rollladen-Technik (Busmodule\LCN Module\Rollläden/EG (000, 005)),
    19152 Rollladen-Küche-Links (Busmodule\LCN Module\Rollläden/EG (000, 005)),
    17925 Rollladen-Küche-Rechts (Busmodule\LCN Module\Rollläden/EG (000, 005)),
);
?>

//script 57827

<?php
//rollläden schliessen
foreach($jalousien as $k => $v){
    if(LCN_ShutterMoveDown($v)){
        //SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
    }
    sleep(1);
}
?>

Hierbei nervt jedoch, das für die Dauer der Abarbeitung die Sanduhr läuft. Auch habe ich bei dem Script keinen chicen Button den man eben drücken kann (Frau-freundlich eben) Daher die obige Frage. Toll wäre es, wenn ich eine Variable definiere die per Button aufrufe und HINTER dieser Variable dann die einzelnen Object ID´s der Rollläden stehen könnten.

Sollte es schon Lösungsansätze zu den oben genannten Fragen im Forum geben, wäre der Link zu dem Thema ausreichend. Ich bedanke mich bereits im Voraus für eure Zeit und Hilfe.

tomquenten

Der Controller von Esera muss mit seinem eigenen Modul und den dazu passenden Befehlen angesteuert werden. Die von Dir verwendeten Befehle funktionieren nicht. Ob der von Dir verwendete Relaisbaustein vom Controller unterstützt wird, kann ich nicht sagen.

Hallo tomquenten,

wenn du mit der alten Windows Console auf die Instanz gehst, (rechter Mausklick - Befehl testen) kommt ein Fenster hoch, und du kannst die Funktionen testen. Unten im Fenster steht noch PHP-Code, den Haken setzen und du sieht den Befehl. Den kannst du dan kopieren.

Das fehlt mir leider noch in der Webconsole, oder ich habe es übersehen.

Zu 1.) Kümmere dich am besten hier gar nicht um die OneWire-spezifischen Befehle. Per RequestAction (RequestAction — IP-Symcon :: Automatisierungssoftware) kannst du die Variablen unabhängig vom System schalten. RequestAction läuft auf der Variablen, also beispielsweise:


RequestAction(21793, true); // Schalte Steckdose Fenster 5 an

Zu 2.) Hier würde ich dir zu einem zyklischen Ereignis raten. Dort kannst du einstellen, dass die Aktion alle 10 Minuten zwischen 5:30 und 9:30 ausgelöst werden soll. Möchtest du dies auf einzelne Wochentage beschränken, kannst du dies auch mit erweiterten Bedingungen einstellen. Als Aktion würdest du den „Variable umschalten“ wählen. So wechselt der Wert alle 10 Minuten.

Zu 3.) Der Dokubutton ist für Konfigurationsseiten von eigenen Modulen gedacht, findet also im WebFront keine Anwendung. Wenn du allerdings dein Skript in die gewünschte Kategorie verschiebst oder verlinkst, dann kannst du es dort über einen Klick ausführen.

Und @tomgr: Du kannst im Skripteditor in der Leiste oben „Befehl einfügen“ wählen. Dann kannst du eine Instanz mit dazugehöriger Aktion auswählen und fügst den entsprechenden Codeschnipsel direkt in dein Skript ein. Ich habe aber gerade bemerkt, dass es in der Testversion von 5.3 einen Fehler gibt, wenn du eine Variablenschaltung in diesem Dialog wählst. Das fixe ich aber jetzt.

Wenn Du Warte Zeiten vermeiden willst solltest Du nicht mit Befehlen in einer foreach Schleife arbeiten weil diese ja sequentiell abgearbeitet wird.
Wenn Du Dinge parallel ausführen willst kannst Du auch aus einem Skript andere Skripte aufrufen mit IPS_RunSkript diese Skripte laufen dann parallel.
Für einen Button erstellst Du Dir einfach ein Dummy Modul, unterhalb des Dummy Moduls legst Du Dir eine Bool Variable an mit passenden Variablenprofil. Auf die Variable legst Du dann ein Skript zum schalten der Gruppe, dann kannst Du mit dem Button die gesamte Gruppe schalten.

Ich bin total überwältig. Erst einmal vielen herzlichen Dank für so viel Input. Ich werde das jetzt alles der Reihe nach probieren.

@tomgrtomgr

Ich habe keine Windows Console mehr. Hatte mir die Windows exe dazu mal herunter geladen und gestartet, dabei wurde ich jedoch wieder auf die Webconsole umgeleitet.

Ich werde wieder berichten…

Zwischenbericht

Nachdem ich nun endlich Zeit gefunden habe, weiter zu probieren hier nun ein kleiner Zwischenbericht.

@Dr. Niels
Danke für diesen genialen Hinweis mit „RequestAction“. Ich habe mir immer die LCN und 1-Wire Befehle aus der Doku gesucht. RequestAction löst jedoch gleich mehere meiner nächsten Probleme!

Nun habe ich hier 6 Relaisbausteine mit jeweils 8 Relais. Laut Doku bekomme ich bei RequestAction ein TRUE, wenn der Befehl erfolgreich ausgeführt wurde und ein FALSE, wenn nicht. Nachdem ich hier eine Schleife mit allen Relais gemacht habe sind mir die Grenzen von 1-Wire klar geworden.


//definition eg leuchten
include(IPS_GetScriptFile(41276 (defEgLeuchten)));
//definition og leuchten
include(IPS_GetScriptFile(13627 (defOgLeuchten)));

function ausschalten($data){
    $fehler=array();
    foreach($data as $k => $v){
        if(RequestAction($v, true) == FALSE){
            //befehl nicht korrekt ausgeführt, speichere für rekursion
            array_push($fehler,$v);
        }
        usleep(10000);
            //IPS_RUNSCRIPT($v, true){
            //SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
        //}
    }
    var_dump($fehler);
    if(array_key_exists(1, $fehler){
        //ausschalten($fehler);
    }
}

ausschalten($data);

Lasse ich usleep weg, rattert das Script alles runter, aber es bleiben immer(!) Relais eingeschalten / ausgeschalten. Im Array $fehler ist jedoch nichts zu finden, laut Script sollten dort ja die ObjectIDs der nicht korrekt geschaltenen Relais aufzufinden sein. Ich denke jedoch, das der Befehl TRUE liefert, wenn der Befehl korrekt an den Controller übertragen wurde und nicht vom Empfänger korrekt empfangen / quittiert und ausgeführt wurde. Kann das jemand bestätigen?

Benutze ich usleep im Script ist die Fehlerquote ERHEBLICH geringer, also es bleiben etwa 2-5 Relais eingeschalten / ausgeschalten.

Ich bin der Meinung bei 1-Wire mal gelesen zu haben, das der Empfänger den Befehl quittieren kann, sofern er empfangen und korrekt ausgeführt wurde.

@Fonzo
Vielen Dank auch an Dich für diesen Hinweis. Das wird auch umgesetzt! Habe schon probiert, klappt super.

Danke
tomquenten