CODESCHNIPSEL: PERL

Anbindung des Controllers an externe Hausautomationssysteme.
Benutzeravatar
Alex
Administrator
Beiträge: 9988
Registriert: 28. Mai 2014, 23:00

CODESCHNIPSEL: PERL

Beitrag von Alex »

Einfaches Beispiel um mit Perl den Controller ab zu fragen und aus den Daten fertige Messwerte inkl. Einheiten zu berechnen.

Code: Alles auswählen

#!/usr/bin/perl
use CGI::Carp "fatalsToBrowser";
use LWP::Simple qw ($ua get);
$ua->timeout(5);
$ua->agent('Parser - mainFile');
$ua->credentials('demo.poolcontroller.de:80','NeedPassword','username'=>'passwort');
print "Content-type: text/html\n\n";
 
#### URL zur GetState.csv am Controller (http://IP-ADRESSE/GetState.csv)
$controllerip = "http://demo.poolcontroller.de/GetState.csv";
 
####Controller abfragen
@data = get($controllerip) || die print "timeout";
$data = "@data";
 
 
### Zeilen der GetState splitten
### 1. Zeile enthält System-Infos wie z.B. Firmwareversion, Uptime, Status der Dosierungen (AUS oder AUTO), etc...
### 2. Zeile enthält Namen der Sensoren/Aktoren
### 3. Zeile Einheiten der Messwerte
### 4. Zeile Offset um aus dem Rohmesswert einen fertigen Messwert zu berechnen
### 5. Zeile GAIN   um aus dem Rohmesswert einen fertigen Messwert zu berechnen
### 6. Zeile Rohmesswerte
 
 
($sys,$names,$units,$offset,$gain,$value) = split(/\n/,$data);
 
### Beispiel um alle Namen einzelnen Variablen zu zu ordnen
($controllertimen,$adc1n,$adc2n,$adc3n,$adc4n,$adc5n,$rdxn,$phn,$temp1n,$temp2n,$temp3n,$temp4n,$temp5n,$temp6n,$temp7n,$temp8n,$relais1n,$relais2n,$rrelais3n,$relais4n,$relais5n,$relais6n,$relais7n,$relais8n,$di1n,$di2n,$di3n,$di4n,$rel9n,$rel10n,$rel11n,$rel12n,$rel13n,$rel14n,$rel15n,$rel16n,$clkanistern,$phminuskanistern,$phpluskanistern)  = split(/,/,$names);
 
 
### Beispiel um alle Einheiten einzelnen Variablen zu zu ordnen
($controlelrtimeu,$adc1u,$adc2u,$adc3u,$adc4u,$adc5u,$rdxu,$phu,$temp1u,$temp2u,$temp3u,$temp4u,$temp5u,$temp6u,$temp7u,$temp8u,$relais1u,$relais2u,$rrelais3u,$relais4u,$relais5u,$relais6u,$relais7u,$relais8u,$di1u,$di2u,$di3u,$di4u,$rel9u,$rel10u,$rel11u,$rel12u,$rel13u,$rel14u,$rel15u,$rel16u,$clkanisteru,$phminuskanisteru,$phpluskanisteru)  = split(/\,/,$units);
 
 
### Beispiel um alle Rohwerte einzelnen Variablen zu zu ordnen
($controllertimev,$adc1v,$adc2v,$adc3v,$adc4v,$adc5v,$rdxv,$phv,$t1v,$t2v,$t3v,$t4v,$t5v,$t6v,$t7v,$t8v,$r1v,$r2v,$r3v,$r4v,$r5v,$r6v,$r7v,$r8v,$di1v,$di2v,$di3v,$di4v,$r9v,$r10v,$r11v,$r12v,$r13v,$r14v,$r15v,$r16v,$clkanisterv,$phminuskanisterv,$phpluskanisterv) = split(/\,/,$value);
 
 
 
### Beispiel um aus allen Rohwerten mit Hilfe von "OffSet" und "Gain" einen fertigen Messwert zu berechnen und aus zu geben
@names  = split(",", $names);
@units  = split(",", $units);
@value  = split(",", $value);
@offset = split(",", $offset);
@gain   = split(",", $gain);
 
 
### Controlleruhrzeit aus den Rohdaten ermitteln
if (($controllertimev & 0xFF) < 10) { $time = ($controllertimev>>8).":0".($controllertimev & 0xFF); }
else                                { $time = ($controllertimev>>8).":".($controllertimev & 0xFF); }
 
 
print "<table cellpadding=2>";
print "<tr><td> Uhrzeit: </td> <td> $time @units[0]</td></tr>";
 
 
for ($i=1;$i<$#value+1;$i++)
{
### fertigen Messwert berechnen
$wert = @offset[$i] + (@gain[$i] * @value[$i]);
 
### Messwert auf 2 Nachkommastellen runden
$wert = sprintf("%.2f", $wert);
 
###Ausgeben
print "<tr><td> @names[$i]: </td> <td> $wert @units[$i]</td></tr>";
}
 
print "</table>";
exit;
Zeile 6 und 10 muss man entsprechend seinen Gegebenheiten anpassen. Also Adresse zum Controller ändern und username und passwort entsprechend setzen
Demo Ausgabe sieht hier dann so aus: http://www.lembi.de/pool/demo.pl

Benutzeravatar
Syon
Beiträge: 119
Registriert: 6. Januar 2015, 12:49

Re: CODESCHNIPSEL: PERL

Beitrag von Syon »

Kann man auch Daten zurück schreiben!
Sprich Softwareseitig Knöppe drücken?

Benutzeravatar
Alex
Administrator
Beiträge: 9988
Registriert: 28. Mai 2014, 23:00

Re: CODESCHNIPSEL: PERL

Beitrag von Alex »

Ja geht. Je nachdem was man machen möchte ist das mit wenig Aufwand möglich.
Also Softwareseitig ein Relais manuell auslösen ist recht schnell passiert. Allerdings kann das natürlich von einer intern laufenden Regel auch gleich wieder ausgeschaltet werden :)
Wenn das entsprechende Relais vom Controller in keiner Regel benutzt wird, kann man das aber beliebig EIN/AUS schalten über eine externe Software und es behält auch diesen Zustand. Ein HTTP GET Request in folgender Form:

http://CONTROLLER_IP/SetState.pl?R1=1&RT1=0
schaltet z.B. Relais 1 permanent ein.

http://CONTROLLER_IP/SetState.pl?R1=1&RT1=5000
schaltet Relais1 für 5000ms ein, dann wieder automatisch aus.

http://CONTROLLER_IP/SetState.pl?R1=1&RT1=0&R2=1&RT2=0&R3=1&RT3=0
schaltet Relais 1-3 permanent EIN.

Benutzt man diese Form um was zu schalten, werden die Relais aber eben von internen Steurungsregeln evtl. wieder zurückgesetzt falls diese auf die gleichen Relais wirken.


Extern die Konfiguration einzelner Steuerungsteile zu ändern geht natürlich auch, ist aber etwas mehr Aufwand, weil man
immer die kompletten Konfigurationsdaten der entsprechenden Option einlesen, manipulieren und richtig formatiert zurück schicken muss. :)

michaelv
Beiträge: 60
Registriert: 6. Januar 2015, 17:03

Re: CODESCHNIPSEL: PERL

Beitrag von michaelv »

geht das mit der Authentfizierung auch noch nach dem Update auf Version 1.6.3 dort steht drin das es nicht mehr geht.

Gruß Michael

Benutzeravatar
Alex
Administrator
Beiträge: 9988
Registriert: 28. Mai 2014, 23:00

Re: CODESCHNIPSEL: PERL

Beitrag von Alex »

Nö, das bezieht sich nur auf den Aufruf der Benutzeroberfläche über den Browser :)
...der Rest geht nach wie vor.

Benutzeravatar
Syon
Beiträge: 119
Registriert: 6. Januar 2015, 12:49

Re: CODESCHNIPSEL: PERL

Beitrag von Syon »

Sehr schick, Danke...

Vielleicht werde ich das mal mit dem Rasperry Pi testen...

Benutzeravatar
Idefix
Beiträge: 20
Registriert: 6. Januar 2015, 12:55

CODESCHNIPSEL: Java

Beitrag von Idefix »

Hallo für jemanden der dies auch benötigt.
Nicht für die Signatur / dies ist für das Webfrontend
schaltet Relais X für 5000ms änderbar ein, dann wieder automatisch aus.

Einfach den JavaScript ohne
<script language="JavaScript">
<!--

in den vorhandenen JavaScript ganz unten vor

//-->
</script >
einfügen.


Code: Alles auswählen

<script language="JavaScript">
<!--
	/* handelt die Browser spezifischen requestIimplementeirungen ab*/
	function createRequest() {
		var xmlHttpObject = false;
		if (typeof XMLHttpRequest != 'undefined') {
		    xmlHttpObject = new XMLHttpRequest();
		}
		if (!xmlHttpObject) 
		{
		    try {
			xmlHttpObject = new ActiveXObject("Msxml2.XMLHTTP");
		    } catch(e) {
			try {
			    xmlHttpObject = new ActiveXObject("Microsoft.XMLHTTP");
			} catch(e) {
			    xmlHttpObject = null;
			}
		    }
		}
		return xmlHttpObject;
	}
/* Im eigenen Netz nur "/SetState.pl?R  / Von extern http://CONTROLLER_IP bzw. DNS /SetState.pl?R */

	function sendRequest(relaisId) {
		var url = "/SetState.pl?R" + relaisId + "=1&RT" + relaisId + "=5000";
		var req = createRequest();
		req.open("GET", url, false);
		req.setRequestHeader("User-Agent", navigator.userAgent);
		req.send(null)
		if (req.status==200) {
		alert(req.responseText);
		} else {
			alert("Konnte nicht gesendet werden!");
		}
	}
//-->
</script>
Zum schalten

Code: Alles auswählen

<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0">

<!-- " sendRequest(12) "  die 12 ist das Relais das geschaltet werden soll -->

 <tr bgcolor="#FFFFFF" style="display:none">
    <td align="center" onClick="sendRequest(12)"><img src="gif/red-on.gif" width=64 height=64 alt="n.a."></td>
    <td align="center" onClick="sendRequest(13)"><img src="gif/red-on.gif" width=64 height=64 alt="n.a."></td>
    <td align="center" onClick="sendRequest(14)"><img src="gif/red-on.gif" width=64 height=64 alt="n.a."></td>
    <td align="center" onClick="sendRequest(15)"><img src="gif/red-on.gif" width=64 height=64 alt="n.a."></td>
    <td align="center" onClick="sendRequest(16)"><img src="gif/red-on.gif" width=64 height=64 alt="n.a."></td>
   </tr>
</table>
Zuletzt geändert von Idefix am 30. Mai 2015, 11:14, insgesamt 2-mal geändert.

Benutzeravatar
Frankie
Beiträge: 311
Registriert: 22. Dezember 2014, 22:29

Re: CODESCHNIPSEL: PERL

Beitrag von Frankie »

kannst die Controllerbedienung auch direkt aus der Signatur herraus machen :-)

charlie71
Beiträge: 6
Registriert: 20. Juni 2015, 19:58

Re: CODESCHNIPSEL: PERL

Beitrag von charlie71 »

Hallo Leute

ich möchte die Relais nicht nur ein / aus schalten, sondern die Steuerung in den Automatikmode setzten. Gibts dafür auf einen Codeschnipsel?

lG
Charlie71

Benutzeravatar
Alex
Administrator
Beiträge: 9988
Registriert: 28. Mai 2014, 23:00

Re: CODESCHNIPSEL: PERL

Beitrag von Alex »

Ne, da gibts keinen Schnipsel zu.
Kann ich jetzt auch nicht so wirklich erklären.. hab die Bit shifterei noch nie verstanden :D ... könnte mal was basteln, bin aber ab Morgen erstmal 8 Tage im Urlaub.

Benutzeravatar
Frankie
Beiträge: 311
Registriert: 22. Dezember 2014, 22:29

Re: CODESCHNIPSEL: PERL

Beitrag von Frankie »

Hi Charlie71
du meinst die Relais in den (A)utomatik zustand setzen ?
oder die Dosierung an / ausschalten ?

das erste wird mit einem Perlscript gehen , das zweite nicht
willst das wirklich machen ?
ist etwas komplexer , weil du vorher den aktuellen Zustand aller max 16 Relais abfragen musst und die entsprechenden bitpositionen maskieren musst
mit einem POST Aufruf kannst du dann den Zustand ALLER max 16 Relais zurückschicken ( nach der bit Maskierung)
da steht dann für jedes Relais drin ob es manuel oder Auto betrieben werden soll und im Fall von manuell, welchen Zustand soll das Relais haben
kann ich dir per mail erklären was du tun müsstest , würde hier an dieser Stelle den Rahmen sprengen
gruß
Frank

Sevensworld
Beiträge: 56
Registriert: 13. April 2016, 18:42

Re: CODESCHNIPSEL: PERL

Beitrag von Sevensworld »

Gibt es hier schon etwas neues?
Ich suche ebenfalls eine Möglichkeit die Bedienung der Relais (EIN/AUTO/AUS) per Script setzen zu können.

Hier steht: Relais wird permanent eingeschaltet, aber von den internen Regeln überschrieben. Was denn nun .. permanent oder nicht ?? Oder welche internen Regeln überschreiben den Zustand "permanent ein" ? :HÄ:
http://CONTROLLER_IP/SetState.pl?R1=1&RT1=0
schaltet z.B. Relais 1 permanent ein.
=0 wäre dann ja permanent AUS, oder ? Wie ist der Befehl für AUTO ? Wäre es möglich den Befehl zu integrieren?

Toll wäre eine Art Schnittstelle, die Datentelegramme entgegen nimmt und umsetzt und man somit nicht auf diese http Links angewiesen ist.

*edit*
Hmm, falls das nicht der richtige Thread ist, dann sorry .. bin über die Suche hier gelandet :|


Gruß
Jens

lenny.cb
Beiträge: 33
Registriert: 21. Juli 2015, 14:30

Re: CODESCHNIPSEL: PERL

Beitrag von lenny.cb »

Alex hat geschrieben:Einfaches Beispiel um mit Perl den Controller ab zu fragen und aus den Daten fertige Messwerte inkl. Einheiten zu berechnen.

Code: Alles auswählen

#!/usr/bin/perl
use CGI::Carp "fatalsToBrowser";
use LWP::Simple qw ($ua get);
$ua->timeout(5);
$ua->agent('Parser - mainFile');
$ua->credentials('demo.poolcontroller.de:80','NeedPassword','username'=>'passwort');
print "Content-type: text/html\n\n";
 
#### URL zur GetState.csv am Controller (http://IP-ADRESSE/GetState.csv)
$controllerip = "http://demo.poolcontroller.de/GetState.csv";
 
####Controller abfragen
@data = get($controllerip) || die print "timeout";
$data = "@data";
 
 
### Zeilen der GetState splitten
### 1. Zeile enthält System-Infos wie z.B. Firmwareversion, Uptime, Status der Dosierungen (AUS oder AUTO), etc...
### 2. Zeile enthält Namen der Sensoren/Aktoren
### 3. Zeile Einheiten der Messwerte
### 4. Zeile Offset um aus dem Rohmesswert einen fertigen Messwert zu berechnen
### 5. Zeile GAIN   um aus dem Rohmesswert einen fertigen Messwert zu berechnen
### 6. Zeile Rohmesswerte
 
 
($sys,$names,$units,$offset,$gain,$value) = split(/\n/,$data);
 
### Beispiel um alle Namen einzelnen Variablen zu zu ordnen
($controllertimen,$adc1n,$adc2n,$adc3n,$adc4n,$adc5n,$rdxn,$phn,$temp1n,$temp2n,$temp3n,$temp4n,$temp5n,$temp6n,$temp7n,$temp8n,$relais1n,$relais2n,$rrelais3n,$relais4n,$relais5n,$relais6n,$relais7n,$relais8n,$di1n,$di2n,$di3n,$di4n,$rel9n,$rel10n,$rel11n,$rel12n,$rel13n,$rel14n,$rel15n,$rel16n,$clkanistern,$phminuskanistern,$phpluskanistern)  = split(/,/,$names);
 
 
### Beispiel um alle Einheiten einzelnen Variablen zu zu ordnen
($controlelrtimeu,$adc1u,$adc2u,$adc3u,$adc4u,$adc5u,$rdxu,$phu,$temp1u,$temp2u,$temp3u,$temp4u,$temp5u,$temp6u,$temp7u,$temp8u,$relais1u,$relais2u,$rrelais3u,$relais4u,$relais5u,$relais6u,$relais7u,$relais8u,$di1u,$di2u,$di3u,$di4u,$rel9u,$rel10u,$rel11u,$rel12u,$rel13u,$rel14u,$rel15u,$rel16u,$clkanisteru,$phminuskanisteru,$phpluskanisteru)  = split(/\,/,$units);
 
 
### Beispiel um alle Rohwerte einzelnen Variablen zu zu ordnen
($controllertimev,$adc1v,$adc2v,$adc3v,$adc4v,$adc5v,$rdxv,$phv,$t1v,$t2v,$t3v,$t4v,$t5v,$t6v,$t7v,$t8v,$r1v,$r2v,$r3v,$r4v,$r5v,$r6v,$r7v,$r8v,$di1v,$di2v,$di3v,$di4v,$r9v,$r10v,$r11v,$r12v,$r13v,$r14v,$r15v,$r16v,$clkanisterv,$phminuskanisterv,$phpluskanisterv) = split(/\,/,$value);
 
 
 
### Beispiel um aus allen Rohwerten mit Hilfe von "OffSet" und "Gain" einen fertigen Messwert zu berechnen und aus zu geben
@names  = split(",", $names);
@units  = split(",", $units);
@value  = split(",", $value);
@offset = split(",", $offset);
@gain   = split(",", $gain);
 
 
### Controlleruhrzeit aus den Rohdaten ermitteln
if (($controllertimev & 0xFF) < 10) { $time = ($controllertimev>>8).":0".($controllertimev & 0xFF); }
else                                { $time = ($controllertimev>>8).":".($controllertimev & 0xFF); }
 
 
print "<table cellpadding=2>";
print "<tr><td> Uhrzeit: </td> <td> $time @units[0]</td></tr>";
 
 
for ($i=1;$i<$#value+1;$i++)
{
### fertigen Messwert berechnen
$wert = @offset[$i] + (@gain[$i] * @value[$i]);
 
### Messwert auf 2 Nachkommastellen runden
$wert = sprintf("%.2f", $wert);
 
###Ausgeben
print "<tr><td> @names[$i]: </td> <td> $wert @units[$i]</td></tr>";
}
 
print "</table>";
exit;
Zeile 6 und 10 muss man entsprechend seinen Gegebenheiten anpassen. Also Adresse zum Controller ändern und username und passwort entsprechend setzen
Demo Ausgabe sieht hier dann so aus: http://www.lembi.de/pool/demo.pl
hallo,
kann die datei auf dem Controller im Stammverzeichnis ausgeführt werden oder muss ein Raspi mit Webserver o.Ä. her?

Benutzeravatar
Alex
Administrator
Beiträge: 9988
Registriert: 28. Mai 2014, 23:00

Re: CODESCHNIPSEL: PERL

Beitrag von Alex »

Ne auf dem Controller nicht. Der hat ja alle Werte selber.
Das ist für externe Systeme wie ein PI oder irgendein anderer Server einer IP Symcon, FHEM, ...

Sven
Beiträge: 24
Registriert: 19. Juli 2015, 19:48

Re: CODESCHNIPSEL: PERL

Beitrag von Sven »

Frankie hat geschrieben: du meinst die Relais in den (A)utomatik zustand setzen ?
ist etwas komplexer , weil du vorher den aktuellen Zustand aller max 16 Relais abfragen musst und die entsprechenden bitpositionen maskieren musst
mit einem POST Aufruf kannst du dann den Zustand ALLER max 16 Relais zurückschicken ( nach der bit Maskierung)
da steht dann für jedes Relais drin ob es manuel oder Auto betrieben werden soll und im Fall von manuell, welchen Zustand soll das Relais haben
kann ich dir per mail erklären was du tun müsstest , würde hier an dieser Stelle den Rahmen sprengen
gruß
Frank
Hallo Frank,
mich interessiert das auch wie man die Ausgänge extern ,in meinem Fall IOBroker (Javascript) Anzeige auf Wand Tablet, verändern kann. Auto/Ein/Aus
Das mit den 16Bit hört sich jetzt erst einmal nicht ganz so komplex an. Hast Du eine Beschreibung wie man vorgehen muss?

Gruß
Sven

Benutzeravatar
Raffke
Beiträge: 80
Registriert: 20. Juni 2016, 22:19

Re: CODESCHNIPSEL: PERL

Beitrag von Raffke »

Sieht so aus, als hätte ich hier den richtigen Thread gefunden! :D
An dieser Stelle auch nochmal großen Dank an Sven für sein Script zum Lesen der Werte.

Das mit dem Schalten der Relais ist, wenn man die Bitcodierung verstanden hat, nicht so ganz schwer:
Man nehme einen Browser seiner Wahl (z.Bsp. Firefox) und beobachte einfach in der Netzwerkanalyse, was dem Controller so beim Spielen im GUI gesendet wird.
Einziges Problemchen ist, dass das betreffende Modul "usercfg.cgi" nur POST Daten annimmt, aber mit CURL z.Bsp. kann man alle Aktoren zurück auf "Auto" setzen:

Code: Alles auswählen

curl --request POST  --header "Authorization: Basic {PASSWORD_HASH}" --data "ENA=0,0&MANUAL=1" http://poolcontroller.fritz.box/usrcfg.cgi
Den Password-Hash kann man aus der Datei /usr/passwd.ini auslesen - das Standardpasswort "admin" ist dort bei mir als "YWRtaW46YWRtaW4=" hinterlegt, also "Authorization: Basic YWRtaW46YWRtaW4=".
Was ich bisher noch nicht ganz verstanden habe: das GUI lässt das Ändern der Zustände nur nach Anmeldung zu, mit CURL funktionierte es bei mir auch komplett ohne den Autorization-Header... ;)

Aber zurück zum Thema:
Der Parameter "MANUAL=1" legt die gewünschte Funktion fest (Schalten der Aktoren) und ENA enthält 2 Bitcodes. Der erste setzt das jeweilige Bit auf 1, wenn das Relais auf manuell steht, eine 0 bedeutet dann AUTO. Die Zahl hinter dem Komma ist analog aufgebaut und setzt die Bits, welche der manuellen Relais AN sind.
Um also beispielsweise das 5. Relais manuell AN zu schalten und alle anderen auf Auto zu belassen, geht ein:

Code: Alles auswählen

curl --request POST  --data "ENA=16,16&MANUAL=1" http://poolcontroller.fritz.box/usrcfg.cgi
Relais 5 und 2 manuell, aber nur 2 an dann entsprechend:

Code: Alles auswählen

curl --request POST  --data "ENA=18,2&MANUAL=1" http://poolcontroller.fritz.box/usrcfg.cgi
Frage an Alex bzw. Frank:
Gibt es eine Liste der möglichen Kommandos? Oder gar noch einen freundlicheren Weg für einfache Dinge?

Hintergrund:
Ich würde gern ohne Dämmerungsschalter die UWS nach Sonnenuntergang einschalten. In meinem CCU.IO (Vorgänger von IO.Broker) habe ich ohnehin die Sonnenauf- und -untergänge und kann demnach die Zeitsteuerung setzen. Problem dabei ist aber, dass "TIMEC=1" sicherlich immer alle Zeitregeln erwartet, obwohl ich nur eine setzen möchte.
Das ist mir zumindest bei meinem Test beim Setzen der 1-Wire Konfiguration auf die Füße gefallen. Ein einfaches "S0NAME=Test" hat alle Romcodes und anderen Namen gelöscht... :roll:

VG, Sven

Benutzeravatar
Alex
Administrator
Beiträge: 9988
Registriert: 28. Mai 2014, 23:00

Re: CODESCHNIPSEL: PERL

Beitrag von Alex »

>>mit CURL funktionierte es bei mir auch komplett ohne den Autorization-Header...
Ja, solange der Request aus Deinem Heimnetzwerk kommt (lokaler IP Adressbereich) funktioniert das auch ohne den Auth Header. Das GUI verlangt immer den Login. Für HA Systeme hatten wir das Schema beibehalten das Requests aus dem internen Netzwerk auch so akzeptiert werden (weil so mancher seine Schwierigkeiten hatte den Header korrekt mit zu schicken).

>>Problem dabei ist aber, dass "TIMEC=1" sicherlich immer alle Zeitregeln erwartet, obwohl ich nur eine setzen möchte.
Richtig. Du muss immer (gilt für jede Konfigdatei) alle Parameter mitschicken. Die Länge bzw. die Anzahl der Parameter wird intern erwartet.
Wenn Du eine einzelne Zeitregel verändern willst, musst Du vorher die entsprechende .ini komplett einlesen, die betreffenden Parameter verändern und dann alle zurückschicken.

Alternativ könntest für den Fall aber ja auch das entsprechende Relais über die HA einfach auf Manuel ON setzen? Is vielleicht einfacher als immer die Zeitregel neu zu schreiben?

Oder, wenn dieses Relais (für die Beleuchtung) generell nicht mehr über eine Regel vom Controller gesteuert werden muss, kannst das Relais ja auch einzeln mit
.../SetState.pl?R5=1&RT5=0 ansprechen. (Das Schaltet Relais 5 dauerhaft ein)
.../SetState.pl?R5=0&RT5=0 (Schaltet es wieder aus)
.../SetState.pl?R5=1&RT5=10000 (schaltet für 10 Sekunden ein)
.../SetState.pl?R5=1&RT5=7200000 (schaltet für 7200 Sekunden ein - 2 Stunden)

Lassen sich auch mehr Parameter in einem Request übergeben
.../SetState.pl?R5=1&RT5=0&R6=1&RT6=1000 (Das Schaltet Relais 5 dauerhaft ein und Relais 6 für 1 Sekunde ein)

Benutzeravatar
Raffke
Beiträge: 80
Registriert: 20. Juni 2016, 22:19

Re: CODESCHNIPSEL: PERL

Beitrag von Raffke »

Danke, Alex!

Auf das naheliegendste kommt man oft nicht ohne Hilfe. ;)
Natürlich - da ich eh schon zum Zeitpunkt des Sonnenuntergangs die Rollläden herunterfahre, kann ich da dann auch das Licht einschalten.

Sehr schön auch die Möglichkeit, eine Zeit anzugeben - dann spare ich mir den erneuten Aufruf vor Mitternacht bzw. verhindere auch den Fall, dass dieser aus welchen Gründen auch immer nicht funktioniert und das Licht somit tagelang anbleibt. Damit kann ich gut leben!

Benutzeravatar
Raffke
Beiträge: 80
Registriert: 20. Juni 2016, 22:19

Re: CODESCHNIPSEL: PERL

Beitrag von Raffke »

Ich habe gestern mal wieder nach versteckten/undokumentierten Funktionen gesucht...
Das GUI ruft z.Bsp. noch eine "/GetDos.csv" auf, aus der beispielsweise die Zeit bis zum nächsten Dosierzyklus ermittelt werden kann.
Gibt es eine ähnliche Funktion auch für die Zeit, die mit "/SetState.pl" gesetzt wurde?

Hintergrund ist, dass ich noch schnell die Filterpumpe für ein paar Stunden anstellen wollte. Dummerweise habe ich beim zusammenkopieren des Aufrufs nicht die Zeit für Relais 1, sondern die für Relais 2 übergeben (/SetState.pl?R1=0&RT2=21600000). Die Pumpe ging an und (erstmal) war alles gut. Heute morgen sehe ich aber, dass sie immer noch läuft...
Offenbar führt also ein Weglassen des Parameters RTx dazu, dass das Relais unendlich lange eingeschaltet bleibt.
Ich habe es manuell ausgeschaltet, Pumpe war aus, dann wieder auf AUTO, Pumpe war wieder an - lässt sich also nur explizit mit erneutem "/SetState.pl" korrigieren.
Da stellte sich mir mal wieder die Frage, ob man irgendwie abfragen kann, warum ein Relais im AUTO Modus an ist. Aus hat ja immer Vorrang, somit müsste eigentlich genau/mindestens eine Regel ermittelbar sein, warum das Relais an ist. Und wenn es eben eine manuelle Zeitsteuerung mittels "/SetState.pl" ist, dann wäre es analog zu "/GetDos.csv" schön, wenn man die verbleibende Restlaufzeit ermitteln könnte...

Benutzeravatar
Alex
Administrator
Beiträge: 9988
Registriert: 28. Mai 2014, 23:00

Re: CODESCHNIPSEL: PERL

Beitrag von Alex »

Nein, warum ein Relais an ist kann man nirgends abfragen.

>>Offenbar führt also ein Weglassen des Parameters RTx dazu, dass das Relais unendlich lange eingeschaltet bleibt.
Jo, ist ja weiter oben auch beschrieben... Wenn Du ein Relais über die SetState ohne Übergabe einer Zeit einschaltest... dann bleibt es erwartungsgemäß natürlich dauerhaft an :)
... bis Du es wieder über die SetState aus schaltest. Außer irgendeine interne Regel würde es explizit OFF setzen - sowas wie ein ausgelöster Trockenlaufschutz - dann geht es erstmal AUS... der Status, der über die SetState gesetzt wurde, bleibt aber immer noch erhalten und würde wieder greifen wenn man den Trockenlaufschutz dann zurücksetzt.