Seite 1 von 1

Beispiele gesucht.

Verfasst: Montag 5. Oktober 2009, 16:36
von andy
Hallo,

Wir bitten die User um Beispiele für die UDP - Steuerung in verschiedenen Sprachen.

Danke im Voraus.

LG Andy

Re: Beispiele gesucht.

Verfasst: Freitag 11. Dezember 2009, 16:44
von Evil.2000
PHP Codebeispiel zum Schalten der Dosen per UDP

Code: Alles auswählen

/**
 * Switch Anel NET-PwrCtrl surge via UDP
 * 
 * @param string	$ip
 * @param integer	$surge_no
 * @param integer	$state
 * @param integer	$port
 * @param string	$password
 * @return boolean
 */
function surge_switch($ip="192.168.0.244",$surge_no=0,$state=0,$port=75,$password="user") {
	$port = intval($port);
	$surge_no = intval($surge_no);

	if(!$ip || !$port || !strlen($password) || !$surge_no)
		return false;

	$cmd = (!$state ? "Sw_off" : "Sw_on").$surge_no.$password.chr(0)."\r\n";

	$fp = fsockopen("udp://".$ip, $port,$errno,$errstr);
	if (!$fp) return false;
    fwrite($fp, $cmd);
    fclose($fp);

    return true;
}

Re: Beispiele gesucht.

Verfasst: Mittwoch 27. Januar 2010, 13:41
von Evil.2000
PHP Code um Anel NETPwr Steckdosen per UDP abzufragen.

Code: Alles auswählen

/**
 * Search Anel NET surges via UDP broadcast
 *
 * @param integer $listen_port
 * @param string $ip
 * @param integer $port
 * @return array or false on failure
 */
function find_surge_switch($listen_port=77,$ip="255.255.255.255",$port=75) {

	if(!$ip || !$port || !$listen_port)
		return false;

	$opts = array('socket' => array('bindto' => '0.0.0.0:'.$listen_port));
	$context = stream_context_create($opts);
	$fp = stream_socket_client("udp://".$ip.":".$port, $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
	if (!$fp) {
		echo $errstr;
		return false;
	}
    fwrite($fp, $cmd);

    usleep(500000);
    fwrite($fp, "wer da?\r\n");
    $data = fread($fp,1024);
    fclose($fp);
    
    $surgeinfo = array_combine(array("type","name","ip","mask","gateway","mac","surge1","surge2","surge3","surge4","surge5","surge6","surge7","surge8","disabled","http_port",),explode(":",trim($data)));
    foreach ($surgeinfo as $k=>$v) {
    	if (preg_match("/^surge(\d)$/i",$k,$regs)) {
    		$no = $regs[1];
    		$surgeinfo["surge"][$no] = array_combine(array("name","state"),explode(",",$v));
    		$surgeinfo["surge"][$no]["disabled"] = ($surgeinfo["disabled"] & pow(2,$no-1)) >> ($no-1);
    		unset($surgeinfo[$k]);
    	}
    }
    unset($surgeinfo["disabled"]);
    $surgeinfo["mac"] = array_reduce(explode(".",$surgeinfo["mac"]),create_function('$a,$b','return strtoupper((strlen($a) ? $a.":" : "").($b>15 ? dechex($b) : "0".dechex($b)));'));

    return $surgeinfo;
}
Die Funktion liefert als Rückgabewert einen Array wie in folgendem Beispiel:

Code: Alles auswählen

Array
(
    [type] => NET-PwrCtrl
    [name] => NET-CONTROL    
    [ip] => 192.168.0.244
    [mask] => 255.255.255.0
    [gateway] => 192.168.0.1
    [mac] => 00:11:22:33:44:55
    [http_port] => 80
    [surge] => Array
        (
            [1] => Array
                (
                    [name] => Nr. 1
                    [state] => 0
                    [disabled] => 0
                )

            [2] => Array
                (
                    [name] => Nr. 2
                    [state] => 1
                    [disabled] => 0
                )

            [3] => Array
                (
                    [name] => Nr. 3
                    [state] => 0
                    [disabled] => 0
                )

            [4] => Array
                (
                    [name] => Nr. 4
                    [state] => 0
                    [disabled] => 1
                )

            [5] => Array
                (
                    [name] => Nr. 5
                    [state] => 0
                    [disabled] => 1
                )

            [6] => Array
                (
                    [name] => Nr. 6
                    [state] => 0
                    [disabled] => 1
                )

            [7] => Array
                (
                    [name] => Nr. 7
                    [state] => 0
                    [disabled] => 1
                )

            [8] => Array
                (
                    [name] => Nr. 8
                    [state] => 0
                    [disabled] => 1
                )

        )

)
========================================================
Als Quintessenz des Ganzen und als Praxisbeispiel hier Code, welcher eine Dose schaltet und dannach prüft, ob diese Dose wirklich geschalten wurde. Solte dies nicht geschehen sein, wird versucht den Dose nochmals zu schalten.
Ich habe versucht den Code so verständlich wir möglich zu kommentieren.
Anmerkung:
Ich habe die Leiste auf den gleichen UDP Sende- und Empfangsport eingestellt (jeweils Port 75), da ich die Leiste durch ein VPN steuere und somit auch eine UDP Kommunikation über lokale Netzwerkgrenzen hinweg möglich ist. Daher ist im Code der Sende und Empfangsport gleich.

Code: Alles auswählen

/**
 * Switch Anel NET-PwrCtrl surge via UDP and check the result
 *
 * @param string	$ip
 * @param integer	$surge_no
 * @param integer	$state
 * @param integer	$port
 * @param string	$password
 * @return boolean
 */
function surge_switch($ip="192.168.0.244",$surge_no=0,$state=0,$port=75,$password="user") {
	$port = intval($port);
	$surge_no = intval($surge_no);
	
	// Do some input checks.
	if(!$ip || !$port || !strlen($password) || !$surge_no)
		return false;

	// Create the command for sending to the surge switch
	$cmd = (!$state ? "Sw_off" : "Sw_on").$surge_no.$password.chr(0)."\r\n";

	// Bind to port $port (send and recieve port are the same for compatibility reasons)
	$opts = array('socket' => array('bindto' => '0.0.0.0:'.$port));
	$context = stream_context_create($opts);
	$fp = stream_socket_client("udp://".$ip.":".$port, $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
	// Check if the binding succeded
	if (!$fp) {
		//echo $errstr;
		return false;
	}
	// Loop until the surge has switched to the wanted state
	do {
    	fwrite($fp, $cmd);
    	// Give surge 500ms time to switch
    	usleep(500000);
    	// Send the "wer da?" packet
    	fwrite($fp, "wer da?\r\n");
    	// Read and parse the data
    	$data = fread($fp,1024);
    	$surgeinfo = parse_surge_switch_response($data);
    	// loop until the surge has switched to the wanted state
    } while ($surgeinfo["surge"][$surge_no]["state"] != $state);

    // Close the UDP connection.
    fclose($fp);

    return true;
}

/**
 * Parse the response of the "wer da?" packet from the Anel NET-PwrCtrl surge switch
 *
 * @param string $data
 * @return array
 */
function parse_surge_switch_response($data) {
	// Create an array with named keys out of the $data variable
	$surgeinfo = array_combine(array("type","name","ip","mask","gateway","mac","surge1","surge2","surge3","surge4","surge5","surge6","surge7","surge8","disabled","http_port",),explode(":",trim($data)));
    // Loop through the array and put surge1 ..2 ..3 into a single array
	foreach ($surgeinfo as $k=>$v) {
		// Parse the key if ist is surge1 ..2 ..3
    	if (preg_match("/^surge(\d)$/i",$k,$regs)) {
    		$no = $regs[1];
    		// Parse "name" and "state" into a subarray
    		$surgeinfo["surge"][$no] = array_combine(array("name","state"),explode(",",$v));
    		// Parse the "disabled" value and place it into a seperate key for this surge
    		$surgeinfo["surge"][$no]["disabled"] = ($surgeinfo["disabled"] & pow(2,$no-1)) >> ($no-1);
    		// Finally, delete the surge1 ..2 ..3 entry
    		unset($surgeinfo[$k]);
    	}
    }
    // Remove the "disabled" entry.
    unset($surgeinfo["disabled"]);
    // Parse the MAC which is in decimal into hexdecimal format
    $surgeinfo["mac"] = array_reduce(explode(".",$surgeinfo["mac"]),create_function('$a,$b','return strtoupper((strlen($a) ? $a.":" : "").($b>15 ? dechex($b) : "0".dechex($b)));'));
    // Finished :-)
    return $surgeinfo;
}
Dieser Code wird "so wie er ist" zur Verfügung gestellt und darf verändert und weitergegeben werden.

Re: Beispiele gesucht.

Verfasst: Sonntag 5. September 2010, 08:08
von Helli
Danke für die Anregungen. Konnte so meine eigene kleine, Pocket PC kompatible, Seite zum Schalten
der Dosen erstellen. Die original "mobile.htm" ist leider nicht richtig programmiert...

Helli

Re: Beispiele gesucht.

Verfasst: Montag 20. September 2010, 10:05
von Evil.2000
Helli hat geschrieben:...
Die original "mobile.htm" ist leider nicht richtig programmiert...
Vielleicht wäre hier eine Nachricht an den Anel Support angebracht, damit diese den Fehler in einer der nächsten Firmware-Versionen beheben können.

Re: Beispiele gesucht.

Verfasst: Freitag 30. Januar 2015, 09:01
von paphko
Als Teil des Anel openHAB Bindings hier ein paar Snippets für Java.

Kommunikation via UDP: https://github.com/openhab/openhab/blob ... ector.java

Parsen der Daten: https://github.com/openhab/openhab/blob ... arser.java

Re: Beispiele gesucht.

Verfasst: Sonntag 10. September 2017, 11:56
von elsa
Absolut einfaches Beispiel mit ausfuehrlicher Erklärung
von einem PHP/UDP/PwrCTRL-Einsteiger für absolute PHP/UDP/PwrCTRL-Einsteiger.

Liebe Anel-Gemeinde
ich nutze einige Anel-PwrCtrl seit Jahren mit der integrierten Weboberfläche. Im Grundsatz bin ich damit zufrieden und finde die ANEL-PwrCtrl genial, und die Hardware äusserst stabil.
Nicht gut zurecht komme ich mit den Programmiermöglichkeiten.


Mit viel Mühe und Aufwand habe ich ein Programmier-Beispiel fuer das Aus- und Anschalten einer ANEL PwrControl in PHP gebastelt.
Dieses Beispiel habe ich aus Anfängersicht (was ich bin) ausführlichst dokumentiert.
Ich habe eine gefühlte Ewigkeit gebraucht, bis das erste Mal ein Relais geschaltet hat.
Mir hat eine für mich verständliche Anleitung und ein einfaches Beispiel mit grundlegenden Erklärungen gefehlt.

Ich würde mich freuen, wenn ich mit dem nachfolgendem Beispielprogrämmchen anderen den Einstieg etwas erleichtern könnte.

Leider ist es mir nicht gelungen, die Programm-Quelldatei als Anhang an dieses Posting zu hängen, deshalb kopiere ich den Quelltext an das Ende des Postings. Ich hoffe, das entspricht den Forumsregeln. @Andy: Falls das nicht OK ist, bitte rausnehmen, danke.
Alles zwischen -* Hier beginnt das Programm -* und -* Hier endet das Programm -* in einen Editor kopieren und die Datei mit dem Namen anel-beispiel.php speichern.

Im nächsten Post suche ich Hilfe bei meinem nächsten Schritt :-)

Viele Grüße und viel Freude beim erstmaligen Klacken eines Relais durch ein eigenes Programm.
Harald


-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* Hier beginnt das Programm -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

<!-- #################################################################### -->
<!-- Beispiel PHP Programm zur Ansteuerung eines ANEL PwrControl -->
<!-- #################################################################### -->

<!-- Dieses Programm schaltet ein Relais auf einer PwrControl aus und wieder an -->
<!-- Komplett lauffaehiges einfaches Beispielprogramm -->
<!-- ausschiesslich fuer absoluten Anfaenger / Einsteiger sinnvoll -->
<!-- Kein praktischer Nutzen ausser LERNEN der Grundfunktion EIN/AUS mit PHP/UDP/PwrCtrl -->


<!-- Alle Zeilen, die mit <!-- beginnen sind HTML-Kommentarzeilen -->
<!-- Diese Zeilen haben nur erklaerende Funktion, sind fuer den Ablauf nicht relevant -->
<!-- Relevant sind auschliesslich die Zeilen die nicht mit <!-- oder // beginnen. -->




<!-- Dies ist eine Programmier-Beispiel fuer Aus- und Anschalten einer ANEL PwrControl -->
<!-- in der Programmiersprache PHP ueber die UDP-Schnittstelle -->
<!-- 10.09.17 Harald Elsaesser, getestet mit NET-PwrCtrl HUT mit Firmware 6.2 -->
<!-- als Webserver dient ein Synology NAS mit PHP 7.0 -->
<!-- als Client sind getestet: Internet-Explorer11 und Firefox 52 ESR -->

<!-- Das Beispiel sollte auch mit anderen PHP-Versionen, anderen PwrControl-Geräten, -->
<!-- anderen PwrControl-Firmware-Versionen und anderen Browsern funktionieren. -->



<!-- Dieses PHP-Programm soll einem Anfaenger anhand dieses absolut einfachen Programmes zeigen -->
<!-- wie die ANEL Netzwerk-Schaltrelais durch ein eigenes PHP-Programm geschaltet werden koennen -->
<!-- Das Programm ist ´uebertrieben´ dokumentiert und kommentiert -->
<!-- so dass ein absoluter PHP-Anfaenger und PwrCtrl-Einsteiger ein grundlegendes -->
<!-- Beispiel zur Verfuegung hat um den Einstieg in die eigene Programmierung finden zu können -->


<!-- Dieses PHP-Programm laeuft auf einem Webserver auf dem PHP installiert und aktiviert ist -->
<!-- Eine sehr einfache Moeglichkeit hierfuer ist ein NAS (eine Netzwerkfestplatte) wie z.B. die Synology-Produkte -->


<!-- Dieses PHP-Programm muss als reine Text-Datei auf den Weberserver-Speicher kopiert werden -->
<!-- Den Dateinamen auf anel-beispiel.php anpassen -->

<!-- Das Programm laeuft nach dem Start auf diesem Webserver. Der Programmablauf findet also auf dem Server statt, -->
<!-- nicht auf dem Client bzw nicht auf dem Browser von dem aus man das PHP-Programm aufruft. -->

<!-- Gestartet wird das PHP-Programm, indem man auf einem Client-Computer einen Browser aufruft,-->
<!-- dann in der Adresszeile des Browsers die Adresse des PHP-Scriptes eingibt -->
<!-- Die Adresse des PHP-Scriptes besteht aus
<!-- http:// http:// und der -->
<!-- IP-Adresse des NAS Hier im Beispiel 192.168.1.175/ und dem -->
<!-- Pfad der PHP-Programmdatei auf dem NAS Hier im Beispiel php/ und dem -->
<!-- Namen der PHP-Programmdatei. Hier im Beispiel anel-beispiel.php -->
<!--
<!-- also zum Beispiel: http://192.168.1.175/php/anel-beispiel.php in das Adressfeld des Browsers eintippen-->



<!-- Ablauf um das Beispiel ausfuehren zu koennen: -->

<!-- Sicherstellen, daß man einen Webserver mit PHP im selben Netzwerk wie das ANEL PwrControl und einen PC hat -->
<!-- Sicherstellen, daß keine Firewall die Ports 75 und 77 blockiert -->
<!-- Diese komplette Programmdatei anel-beispiel.php von einem beliebigen PC im Netzwerk auf den PHP-Bereich des Webservers kopieren. -->
<!-- Kleine Anpassungen (siehe unten, IP-Adresse, RelaisNummer, Benutzername, Passwort, ggf Port) -->
<!-- mit einem reinen Text-Editor wie z.B. NOTEPAD oder EDITOR in der Programmdatei durchfuehren -->
<!-- An einem PC in einem Browser diese Programmdatei ausfuehren Beispiel: http://192.168.1.175/php/anel-beispiel.php -->
<!-- Dann sollte das ausgewaehlte Relais des PwrControl ausgeschaltet und nach einigen Sekunden eingeschaltet werden. -->


<!-- Das Muster darf beliebig benutzt und angepasst werden, ich gebe keinerlei Gewaehrleistung, man nutzt es "wie es ist". -->

<!-- Das Muster ist nicht ´gut´ programmiert. Es geht ausschliesslich darum auf einfachste Art zu zeigen wie ein -->
<!-- PwrControl per PHP angesteuert werden kann. -->
<!-- Ich selbst habe mich ausschliesslich wegen der PwrControls ein wenig mit PHP beschaeftigt und habe SEHR lange gebraucht -->
<!-- bis ich das erste Mal erfolgreich ein Relais schalten konnte. -->
<!-- Mir fehlen eine gute Dokumentation und einfache und ausfuehrlich erklaerte Beispiele -->
<!-- -->
<!-- Ich suche Hilfe von jemand der im Gegensatz zu mir etwas von PHP und den ANEL PwrControl versteht -->
<!-- Deshalb bitte auch mein naechstes Posting im Forum der Anel Elektronik beachten, danke :-) -->





<!-- #################################################################### -->
<!-- #################### Hier geht das Programm los #################### -->
<!-- #################################################################### -->

<!-- Kommentare und Erlaeuterungen stehen immer UEBER dem zu kommentierendem Abschnitt.-->
<!-- Diese kommende Zeile sagt dem Browser, dass ab hier die Programmiersprache PHP gilt.-->
<?php


// -----------------------------------------------------------------------------------
// innerhalb des PHP-Bereichs sind alle Zeilen mit zwei Schraegstrichen am Anfang Kommentarzeilen
// Diese Zeilen sind fuer die Funktion nicht wichtig und koennen weggelassen werden

// Gibt am Bildschirm den Text anel-beispiel START aus. Alle Bildschirmausgaben erfolgen im Browser.
// Achtung: Die Bildschirmausgaben erfolgen erst NACH KOMPLETTEM Ablauf des Programmes!
echo "anel-beispiel START<br>";



// Legt Variablen-Inhalte fest
// Bei $IPAdresse muss die IP-Adresse Deines ANEL PwrControl eingetragen werden WICHTIG
// Bei $Port muss die Port-Nummer Deines ANEL PwrControl eingetragen werden, kann wahrscheinlich bei 75 bleiben
// Bei $RelaisNr muss die Nummer des zu schaltenden Relais Deines ANEL PwrControl eingetragen werden
// Bei $Nutzername muss ein auf dem PwrControl angelegter Benutzer eingetragen werden, Vorgabe ist admin
// Bei $NutzerPasswort muss das zugehoerige Passwort eingetragen werden, Vorgabe ist anel
// Bei $SchaltVorgang muss eingetragen werden, ob man einschalten (on) oder ausschalten (off) will

$IPAdresse="192.168.1.205";
$Port="75";
$RelaisNr="4";
$Nutzername="admin";
$NutzerPasswort="anel";

$SchaltVorgang="off";




// #################################################################### -->
// ############## Hier findet der Ausschaltvorgang statt ############## -->
// #################################################################### -->


// oeffnet den Kommunikationsweg / den UDP-Port des PwrControl
$fp = fsockopen("udp://$IPAdresse",$Port);


// Baut die Befehls-Zeichenkette fuer den Schaltvorgang zusammen
// Die Befehls-Zeichenkette lautet dann z.B. Sw_off1adminanel
$Kommando="Sw_".$SchaltVorgang.$RelaisNr.$Nutzername.$NutzerPasswort;


// Schickt die Befehls-Zeichenkette an das PwrControl
fwrite($fp,$Kommando);


// Schliesst den Kommunikationsweg / den UDP-Port des PwrControl
fclose($fp);

// nun muesste das angegebene Relais auf den angegebenen PwrControl ausgeschaltet sein

// Gibt am Bildschirm den Text "Relais wurde auszuschalten versucht" mit Datum/Uhrzeit aus.
echo "Relais wurde auszuschalten versucht ".date("d.m.Y H:i:s")."<br>";






// #################################################################### -->
// ############# Hier wartet das Programm einige Sekunden ############# -->
// #################################################################### -->


// laesst das programm 5 Sekunden warten damit man auch sehen kann, dass das Relais abgeschaltet ist
sleep (5);





// #################################################################### -->
// ############## Hier findet der Anschaltvorgang statt ############## -->
// #################################################################### -->


// Die Variablen $IPAdresse, $Port, $RelaisNr, $Nutzername und $NutzerPasswort haben von
// oben her immer noch die gewuenschten Werte
// Die Variablen $SchaltVorgang wird auf on gesetzt damit das Relais angeschaltet wird
$SchaltVorgang="on";



// oeffnet den Kommunikationsweg / den UDP-Port des PwrControl
$fp = fsockopen("udp://$IPAdresse",$Port);


// Baut die Befehls-Zeichenkette fuer den Schaltvorgang zusammen
// Die Befehls-Zeichenkette lautet dann z.B. Sw_on1adminanel
$Kommando="Sw_".$SchaltVorgang.$RelaisNr.$Nutzername.$NutzerPasswort;


// Schickt die Befehls-Zeichenkette an das PwrControl
fwrite($fp,$Kommando);


// Schliesst den Kommunikationsweg / den UDP-Port des PwrControl
fclose($fp);

// nun muesste das angegebene Relais auf den angegebenen PwrControl angeschaltet sein

// Gibt am Bildschirm den Text "Relais wurde anzuschalten versucht" mit Datum/Uhrzeit aus.
echo "Relais wurde anzuschalten versucht ".date("d.m.Y H:i:s")."<br>";



// Gibt am Bildschirm den Text anel-beispiel ENDE aus.
echo "anel-beispiel ENDE<br>";

// Diese Zeile sagt dem Browser, dass hier PHP abgeschlossen ist.-->
?>


<!-- Wirklich relevant sind in diesem Programm nur die linksbuendigen 22 NICHT-Kommentarzeilen -->
<!-- Alle Zeilen mit echo an Anfang koennen fuer die Funktion ebenfalls weggelassen werden -->

<!-- Haeufigster Fehler beim Anpassen des Programms: -->
<!-- Im PHP-Bereich muss jede Zeile mit einen Semikolon, einem Strichpunkt ; abgeschlossen sein! -->


<!-- Ich wünsche viel Erfolg beim Einstieg in das Zusammenspiel PHP und PwrControl -->

-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* Hier endet das Programm -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

Re: Beispiele gesucht.

Verfasst: Sonntag 10. September 2017, 11:58
von elsa
Liebe Anel-Gemeinde


Ich habe vor, mir eine eigene kleine Web-Anwendung zu schreiben. Mit dieser möchte ich eine Vielzahl an PwrControl-Hut übersichtlich steuern können.
Das scheint für mich noch ein weiter Weg zu sein.

Im vorherigen Post habe ich ein einfachsten Musterprogrammchen zum Schalten eines Relais einer PwrControl-Hut zur Verfügung gestellt.

Würde mir jemand ein ähnlich einfaches Beispiel basteln für .....?

- per PHP/UDP den Status eines Relais abfragen.
Möglichst so, daß nicht per Polling periodisch gefragt werden muss.
(Am Ende soll ein Button exitieren, der soll rot/aus oder grün/an sein, durch anklicken umzuschalten.)

- per PHP/UDP den Status eines IO-Ports abfragen, wie oben


Ganz so übertrieben dokumentiert wie mein Beispiel braucht es nicht zu sein;-)

Viele Grüße und schon mal vielen Dank :-)
Harald