[Frage] WiFi Schalter aus dem Action

Überfordert mich noch ein wenig; Welche Basis , psg muss ich nehmen und versuchen abzuwandeln?
 
Das als Basis (andere Funksteckdose) :
PHP:
<?php

    /*
        ╔═══╗ ╔═══╗ ╔═══╗ ┌───────────────────────────────────────────────────┐
        ║     ║   ║ ║     │  SensorAndSwitch (C)2014-17 Bluedragon            │
        ╚═══╗ ╠═══╣ ╚═══╗ ├──────────────────┬────────────────────────────────┤
            ║ ║   ║     ║ │  SAS-PsG         │  psgCZ-LED.php                 │
        ╚═══╝ ╝   ╚ ╚═══╝ ├──────────────────┴────────────────────────────────┤
        ┌─────────────────┤  Computerzimmer Leselampe                         │
        │  Info:          ╘═══════════════════════════════════════════════════╡
        ├─────────────────────────────────────────────────────────────────────┤
        │  Edimax Schaltsteckdose                                             │
        ├─────────────────────────────────────────────────────────────────────┤
        │  Diese Variablen müssen gegebenenfalls angepasst werden:            │
        │  - $user ist der Benutzer                                           │
        │  - $password ist das Kennwort                                       │
        │  - $ip ist die IP-Adresse mit Portangabe der Edimax                 │
        │  - $mac ist die MAC-Adresse für die Anzeige im Slot                 │
        │  In den Variablen stehen die Default-Werte als Beispiel             │
        ╘═════════════════════════════════════════════════════════════════════╛
    */
 
    include_once __DIR__."/../include/psg.php";

    $ver="6.00";
    $user="admin";                   # Benutzer
    $password="12345678";            # Kennwort
    $ip="192.168.1.123:10000";       # IP-Adresse der Edimax
    $mac="80:FF:22:FA:9C:B5";        # MAC-Adresse für die Anzeige

    $echo="V#2.02#V#".$mac."*AIN#V#Edimax*Firma#V#SP-1101W*Produkt#V#SAS PsG V ".$ver."*ID#V#manuell*Mode#";  
    $poston='<?xml version="1.0" encoding="utf-8"?><SMARTPLUG id="edimax"><CMD id="setup"><Device.System.Power.State>ON</Device.System.Power.State></CMD></SMARTPLUG>';
    $postoff='<?xml version="1.0" encoding="utf-8"?><SMARTPLUG id="edimax"><CMD id="setup"><Device.System.Power.State>OFF</Device.System.Power.State></CMD></SMARTPLUG>';
    $poststatus='<?xml version="1.0" encoding="UTF8"?><SMARTPLUG id="edimax"><CMD id="get"><Device.System.Power.State></Device.System.Power.State></CMD></SMARTPLUG>';
    $url='http://'.$user.':'.$password.'@'.$ip.'/smartplug.cgi';
   
    $Status="S#2#E##";
    if ($_GET["info"]=="status") {
        $xml=web($url,$poststatus);
        if (strpos($xml,"ON")) {
            $Status="S#1#";
        }
        if (strpos($xml,"OFF")) {
            $Status="S#0#";
        }
    }
    if ($_GET["schalter"]=="1") {
        $Status=web($url,$poston);
        if (strpos("#".$Status,"OK")) {
            $Status="S#1#";
        }
    }
    if ($_GET["schalter"]=="0") {
        $Status=web($url,$postoff);
        if (strpos("#".$Status,"OK")) {
            $Status="S#0#";
        }
    }

    echo $Status.$echo;
    exit;

?>
 
  • Like
Reaktionen: HarryHase
Ich kriege es einfach nicht hin, wenn ich das oben als psg einbaue geht gar nichts mehr, dann spinnt sas komplett. (Denke dass das an der Version liegt, ich habe ja noch 5.00.4916.
Aber auch eine Abwandlung von einer älteren Edimax Dose lüppt nicht. Ich werde wohl auf scripte gehen, da ich das mit den direkten Webaufrufen und den Auswertungen kann.

Vielleicht habe ich auch heute ein besonders dickes Brett vorm Kopf.
 
das Script von der Edimax Steckdose passt da glaube ich nicht so ganz.

hab mal mein Script vom Homematic Schalter was abgeändert!
schalten sollte gehen, wenn das Leerzeichen im Befehl keine probleme macht, eventuell das "on" in die post Variable packen.
Status abfragen geht so sicher noch nicht richtig, müsste man im String nach den Zeichen hinter Power suchen.
ist aber sicher machbar.

PHP:
<?php
    echo "FN#Action-Schalter#";
    /*
      
        +---------------------------------------------------------------------+
        |                                                                     |
        |   SensorAndSwitch Automation Pro                                    |
        |   PseudoGeräte-Script                                               |
        |   ===============================================================   |
        |   -> Schalter  Homematic Schlter Id 1247              |
        +---------------------------------------------------------------------+
        Pfad für Statusdatei und Varaiblen in "conf/statuspfad.php" angegeben !
        */ 
    include __DIR__."/../include/psg.php";
    include __dir__."/../conf/statuspfad.php";
  
    $gerarray=getGerInfo(substr(basename(__FILE__,".php"),3));

    #$url='http://192.168.178.30:81/ws65.exe?go=dom.GetObject("1247:1.STATE").State()'; # für Homematic
    $url='http://192.168.64.135/cm?cmnd=Status 11'; # für Action
    $Status="S##E##";

    if ($_GET["info"]=="status") {
        $xml=web($url,$post);
        if (strpos($xml,"false")) {
            $Status="S#1#";
        }
        if (strpos($xml,"true")) {
            $Status="S#0#";
        }
    }
    if ($_GET["schalter"]=="1") {
#        $url='http://192.168.178.30:81/ws65.exe?go=dom.GetObject("1247:1.STATE").State(0)'; # für Homematic
        $url='http://192.168.64.135/cm?cmnd=Power on';
        $Status=web($url,$post);
        $Status="S#1#";
    }
    if ($_GET["schalter"]=="0") {
#        $url='http://192.168.178.30:81/ws65.exe?go=dom.GetObject("1247:1.STATE").State(1)'; # für Homematic
        $url='http://192.168.64.135/cm?cmnd=Power off'; # für Action
        $Status=web($url,$post);
        $Status="S#0#";
    }
    echo "P#".' Licht Keller, '."*HTML#";
    echo $Status;
    exit;

Edit: bei Statusabfrage mal dies versuchen
Code:
    if ($_GET["info"]=="status") {
        $xml=web($url,$post);
        if (strpos($Status,"ON")) {
            $Status="S#1#";
        }
        if (strpos($Status,"OFF")) {
            $Status="S#0#";
        }
    }
 
Zuletzt bearbeitet:
  • Like
Reaktionen: HarryHase
so neuer Tag neue Ideen ,,, Danke

wie maskiere ich das hier richtige?

1)

Code:
if (strpos($xml,'"Power":1,')) {

Ich muss ja nach "Power":1, und "Power":0, suchen inkl. "

2)
STATUS8 = {"StatusPWR":{"Total":8.931, "Yesterday":2.122, "Today":0.017, "Power":770.9, "Factor":1.00, "Voltage":231, "Current":3.201}}

die 770.9 da raus "popeln"
 
ich dachte du müsstest nur nach ON oder OFF suchen,
das geht ja mit :
if (strpos($xml,'ON')) {

anderer Möglichkeit wenn das gewünschte Ergebnis immer an der gleichen Stelle steht:
$power=substr($xml, 11, 8); # von Position bis Position!
 
Code:
STATUS = {"Status":{"Module":6, "FriendlyName":"sonoff_pow_1", "Topic":"sonoff", "ButtonTopic":"0", "Power":0, "PowerOnState":3, "LedState":1, "SaveData":1, "SaveState":1, "ButtonRetain":0, "PowerRetain":0}}
STATUS = {"Status":{"Module":6, "FriendlyName":"sonoff_pow_1", "Topic":"sonoff", "ButtonTopic":"0", "Power":1, "PowerOnState":3, "LedState":1, "SaveData":1, "SaveState":1, "ButtonRetain":0, "PowerRetain":0}}

durch den friendlyName und dem Topic wandert das leider

Ich wirklich nach den doppelten Anführungszeichen suchen muss

"Power":1

Einsen sind ganz viele drin, das reicht auch nicht

oder andere Möglichkeit wäre es die Position zu finden wo das steht und dann ein oder zwei Zeichen weiter die 0 oder 1 zu extrahieren. Aber ich begreife das mit dem Maskieren der Anführungszeichen nicht.
 
also, ich hab mal versucht,
es geht
if (strpos($xml,'"Power":770.9')) {
oder die Suche erst in ein String packen,

$suche='"Power":770.9';
if (strpos($xml,$suche)) {

geht bei mir beides!

Edit:
geht denn das schalten und Status abrufen aus PHP ?
ist in $xml auch was drin?
 
hurra ich bin einen schrittchen weiter ....
Code:
if (strpos($xml,"\"Power\":1")) {

ich dachte schon ich bin blöd
 
habe es jetzt ganz hinbekommen.

Was noch schön wäre die IP da Anzuzeigen wo AIN oder URL steht, bekommt man das dahin?

Bestimmt schlagen die Profis jetzt die Hände über dem Kopf zusammen wie man das so dilettantisch zusammen zimmern kann, aber wenn es jemanden weiterhilft ist ja schon was gewonnen.

upload_2017-10-19_23-40-20.png

PHP:
<?php
    /*
 
        +---------------------------------------------------------------------+
        |                                                                     |
        |   SensorAndSwitch Automation Pro                                    |
        |   PseudoGeräte-Script                                               |
        |   ===============================================================   |
        |   -> Schalter  Homematic Schlter Id 1247              |
        +---------------------------------------------------------------------+
        Pfad für Statusdatei und Varaiblen in "conf/statuspfad.php" angegeben !
        */
    include __DIR__."/../include/psg.php";
    include __dir__."/../conf/statuspfad.php";
 
    $gerarray=getGerInfo(substr(basename(__FILE__,".php"),3));
    $ver="V#192.168.64.135#";
    $Status="S##E##";
        $power="0";
        # Ausgabe der Leistungsseite
        $url='http://192.168.64.135/cm?cmnd=Status%208';
        $xml=web($url,$post);
    #aktuelle Leistung im String suchen
    $pos1 = strpos($xml,"\"Power\"")+8;
    $pos2 = strpos($xml,", \"Factor\"");
    $power=substr($xml, $pos1, $pos2-$pos1);
 
    # Ausgabe für den Namen und den Status
    $url='http://192.168.64.135/cm?cmnd=Status11'; # für power on/off und Namen
    $xml=web($url,$post);
    #den Namen des Geräts im String suchen
    $pos3 = strpos($xml,"FriendlyName")+15;
    $pos4 = strpos($xml,", \"Topic");
    $name=substr($xml, $pos3, $pos4-$pos3-1);
 
    if ($_GET["info"]=="status") {
        $x=(strpos($xml,"\"Power\":1"));
        if (strpos($xml,"\"Power\":1")) {
            $Status="S#1#";      
        }
        else {
            $Status="S#0#";
        }
    }
    if ($_GET["schalter"]=="1") {
        $url='http://192.168.64.135/cm?cmnd=Power%20on';
        $Status=web($url,$post);
        $Status="S#1#";
    }
    if ($_GET["schalter"]=="0") {
        $url='http://192.168.64.135/cm?cmnd=Power%20off'; # für Action
        $Status=web($url,$post);
        $Status="S#0#";
    }
    echo "FN#".$name."#".$ver;
    echo "W#".floatval($power)."*xxx#";
    echo $Status;
    exit;
?>
 
Zuletzt bearbeitet:
das mit dem Programmcode sehe ich nicht so eng, bin ja auch kein Profi.
hauptsache es funktioniert.
was ich vielleicht noch einbauen würde, der Befehlsaufruf über Sashelper.

Ps.
mein Schalter aus dem Action Kaufhaus, den ich mir zum testen gekauft habe, ist (noch) nicht zu knacken!
ist zwar sehr ähnlich wie die Schalter von Lidl, etc. , wo es auch Anleitungen für gibt,
aber schon der Webaufruf verlangt Benutzer und Passwort, was aber nirgendwo zu finden ist!
auch über Befehle zum schalten aus dem Browser ist nichts zu finden
mit der App funktioniert er ja gut, aber mehr ist nicht drin.
 
  • Like
Reaktionen: HarryHase
PHP:
    $ip="123.123.123.123";
    echo "FN#".$name."#V#".$ip."*AIN#";
    echo "W#".floatval($power)."*xxx#";
    echo $Status;

Dann steht die IP im AIN-Feld.
 
  • Like
Reaktionen: HarryHase
Danke, ich muss sagen die sonoff Teile mit tasmota Firmware sind ein echter Ersatz zu den DECT 200 und kosten nur ein viertel. Ich werde einiges umrüsten und die 200'er verkaufen. Bin schon gespannt wie das mit den Wandschaltern wird. Wenn das auch so funktioniert ist das der Knaller.

Hier dann noch mal für die Nachwelt:

PHP:
<?php
    /*
        +---------------------------------------------------------------------+
        |                                                                     |
        |   SensorAndSwitch Automation Pro                                    |
        |   PseudoGeräte-Script                                              |
        |   ===============================================================   |
        |   -> Schalter  sonoff pow mit tosmato firmware                      |
        +---------------------------------------------------------------------+
    */
    include __DIR__."/../include/psg.php";
 
    $ip="192.168.64.135";
 
    $gerarray=getGerInfo(substr(basename(__FILE__,".php"),3));
    $Status="S##E##";
    # Ausgabe der Leistungsseite
        $url='http://'.$ip.'/cm?cmnd=Status%208';
        $xml=web($url,$post);
    #aktuelle Leistung im String suchen
    $pos1 = strpos($xml,"\"Power\"")+8;
    $pos2 = strpos($xml,", \"Factor\"");
    $power=substr($xml, $pos1, $pos2-$pos1);
 
    # Ausgabe Name und Status
    $url='http://'.$ip.'/cm?cmnd=Status11'; #  on/off und Namen
    $xml=web($url,$post);
    #den Namen im String suchen
    $pos3 = strpos($xml,"FriendlyName")+15;
    $pos4 = strpos($xml,", \"Topic");
    $name=substr($xml, $pos3, $pos4-$pos3-1);
 
    if ($_GET["info"]=="status") {
        $x=(strpos($xml,"\"Power\":1"));
        if (strpos($xml,"\"Power\":1")) {
            $Status="S#1#";      
        }
        else {
            $Status="S#0#";
        }
    }
    if ($_GET["schalter"]=="1") {
        $url='http://'.$ip.'/cm?cmnd=Power%20on';
        $Status=web($url,$post);
        $Status="S#1#";
    }
    if ($_GET["schalter"]=="0") {
        $url='http://'.$ip.'/cm?cmnd=Power%20off';[ATTACH=full]91867[/ATTACH]
        $Status=web($url,$post);
        $Status="S#0#";
    }
    echo "FN#".$name."#V#".$ip."*AIN#";
    echo "W#".floatval($power)."*xxx#";
    echo $Status;
        exit;
?>
upload_2017-10-20_22-44-29.png
 
Zuletzt bearbeitet:
so, nach fast einem Jahr hab ich mich noch einmal mit dem Schalter aus dem Action Kaufhaus beschäftigt.
auf einer Holländischen Seite ein Python Script gefunden, welches ich mit viel probieren zum laufen gebracht habe.
send_homewizard.py
Code:
#!/usr/bin/python

import sys
import requests
import json

searchswitch=sys.argv[1] #bijv. 'Lite'
searchdevice=sys.argv[2] #bijv. 'Controller'
doaction=sys.argv[3] #'On', 'Off'

#searchswitch="Lite" # Bezeichnung von meinem Schalter
#searchdevice="Controller"
#doaction="GetState"
#doaction="Off"
#doaction="On"

print (searchswitch +", "+ searchdevice +", "+ doaction)

r = requests.get("https://cloud.homewizard.com/account/login", auth=('[email protected]','xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'))
# Anmeldedaten erhält man nach dem man sich mit der Lite App registriert hat.
# Passwort muss Sha1 verschlüsselt sein
# Passwort Converter hier https://hash.online-convert.com/sha1-generator gefunden !
# https://gist.github.com/Flavien06/dacdd6bfae400c167798b2ae36ee8cf8

#print (r.status_code)
#print (r.json())
j = r.json()
#j = json.loads(r.text)
sessionid = j['session']
#sessionid = "1"
#print (sessionid)

r = requests.get("https://plug.homewizard.com/plugs", headers={'X-Session-Token': sessionid})
#print (r.text)
#print (r.json())
deviceid=''
j1=json.loads(r.text)
#print (j1)
for i in j1:
    if i['name']==searchswitch:
        plugid=i['id']
        d=i['devices']
        for i1 in d:
            if i1['name']==searchdevice:
                deviceid=i1['id']
#print (plugid)
#print (deviceid)
if deviceid=='':
    print ("Error: device not found!")

url = 'https://plug.homewizard.com/plugs/'+plugid+'/devices/'+deviceid+'/action'
#print (url)
headers = {'X-Session-Token': sessionid,
           'Content-Type': 'application/json; charset=utf-8'
}
payload = {"action": doaction}

r = requests.post(url, data=json.dumps(payload), headers=headers)
print (r.text)

Wichtig,
auf Python Version achten, ich hab Python 3.7 auf Windows 10 installiert. requests war nicht installiert, musste erst pip und dann requests nachträglich installieren!

in searchswitch ist die Bezeichnung des Schalters,
searchdevice="Controller"
und wo ich mich Stunden lang fest gebissen habe,
das Passwort muss mit Sha1 verschlüsselt werden!
hatte immer Login Fehler!
Erklärung dazu auch im Script.
auch sind noch viele ausgeklammerte Zeilen drin die ich zum testen aktiviert hatte.

Nachteil des Schalters, die Verbindung geht über die Cloud!

jetzt muss ich bei Gelegenheit nur noch versuchen das in PHP um zu wandeln, damit das zu meinen anderen Php-Scripts passt.
 
zurück zum Sonoff-Thema:
Mittlerweile verkauft ein bulgarisches Unternehmen den sogenannten "Shelly".
Der funktioniert wie Sonoff mit Tasmota-Firmware.
Der Clou ist die Winzigkeit. Der passt unter den Lichtschalter in die Hohlwanddose. Die Lichtschalterfunktion kann erhalten bleiben, lediglich mal ist "oben" an und mal aus - es wird die Veränderung getriggert. Außerdem benötigt man in der Lichtschalterdose den 2. Leiter, wenn man Glück hat ist direkt daneben ne Steckdose...
Micha
 
bekomme im Januar meinen ersten Shelly Schalter (verspätetes Weihnachtsgeschenk).

inzwischen hab ich mich an einer Obi 3-fach Steckdose mit Wlan-Schalter versucht.
hab das Passwort vom Webinterface zwar rausfinden können,
dann aber beim Firmware Update das Teil geschrottet, macht kein Wlan mehr auf!
könnte man eventuell noch reparieren indem man eine Serielle Schnittstelle anlötet, Kontakte sind vorhanden.
Aber das trau ich mir nicht mehr zu!

also warten auf Shelly.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.