AVM Smarthome Devices wie Fritz!Powerline 546e Auslesen und Schalten

Zunächst: Muss gestehen, dass ich nicht den gesamten Thread gecheckt habe, ob es schon irgendwo steht.

Bei den Kabelboxen - bei mir 6360 von Kabel BW - gibt es ja - wie auf der ersten Seite in einem Beitrag geschrieben, die AHA Schnittstelle nicht.

Dafür kann man die Werte direkt als JSON auslesen:
http://fritz.box/net/home_auto_query.lua?sid=SID&command=EnergyStats_10&id=16&xhr=1&t1454716818264=nocache

Gruß,
Thorsten

Hallo Tommi,

ich habe heute die neuen Scripte installiert, alles alte gelöscht, aber es werden keine Variablen angelegt.
Ich will die Stromwerte von 546e auslesen, habe ich in der Config evtl. was übersehen?

Das Script fritz_aha_reader2 läuft ohne Fehlermeldungen.

Hallo

Habe auch ein Problem
habe das neue Skript fritz_aha-reader2 zum auslesen einer Fritzbox 7490 ausgführt und bekomme unter Meldungen eine Fehlermeldung

Error : Need Multibyte functions (mb_string_connvert)

und das Skript wird abgebrochen.

Kann mir Jemand helfen ?

Habe meinen Fehler gefunden, falsche Firmware auf der Steckdose.

Error : Need Multibyte functions (mb_string_connvert)

Wie der Fehler schon sagt, die PHP Multibyte Extension ist nicht vorhanden oder nicht nicht aktiviert. Unter Windows muss die php_mbstring.dll in der php.ini geladen werden, unter Linux muss sie mit dem Paketmanager nachinstalliert und ggfls. aktiviert werden.

Tommi

BTW: In der jetzt aktuellen c’t 7/2016 ist ab Seite 120 ein Artikel von mir zu dem Thema AVM und Fritzbox

Ich muss das Thema nochmal ausgraben,

Ich habe noch eine sehr alte FB 7270 v2 mit Fritz OS 06.06 (neuere gibt es nicht mehr)
daran hängen zwei Fritz DECT 200.

Dein Skript benötigt ja abr Fritz OS 6.50.

Ich bin mir aber sicher es gab früher eine alte Version die ich schon mal benutzt habe, ich finde sie nur nicht mehr wieder.
Könnt Ihr mir helfen ?

anbei die alte Version für Fritz!OS6.0

Tommi

fritz_aha_reader.ips.php.zip (3.5 KB)

Vielen vielen Dank Tommi :slight_smile:

Könntest du nochmal kurz erklären wie ich den Aktor jetzt schaltbar mache ?
Das auslesen funktioniert bereits wunderbar :slight_smile:

Ich weiß einfach nicht mehr wo ich das fritz_aha_switch Skript wie richtig einbinden muss.

oder brauche ich auch noch ein altes switch skript ?

rein theoretisch sollte das neue Aktorscript auch mit der alten FB funktionieren. Dort in $logins die Anmeldung eintragen und als Action-Script an die Status-Variable hängen.

Tommi

Hallo,

genau das habe ich gemacht aber am Aktor selber passiert nichts und ne Fehlermeldung gibt es auch nicht.

Ich kann im Webfront zwar auf „on“ schalten, dann passiert aber nichts und wenn das reader Skript (was alle 10 Min läuft) ausgeführt wird springt er wieder nach „off“

Keiner von euch PHP- Genies ne Idee für mich :confused:

Was soll schalten, das Webfrontend?
Ansonsten das Script noch bei Variablenänderung aktivieren.
Oder auch in Zeile 29 die ID der Status Variable eintagen und aus dem Scripteditor ausführen. Wenn irgendwas nicht passt, steht es eigentlich unter Meldungen bzw. im Log

So hab nochmal alles so gemacht , genau das Webfront soll schalten.

Hab die ID eingetragen vom Status, habe als Trigger Variablenänderung gesetzt und das ganze als Action Skript eingesetzt.

Leider passiert einfach gar nix :frowning:

Wenn das Script startet, gibt es auch Einträge im Meldungsfenster bzw. im Log. Ist dort nichts, stimmt etwas mit der Aktivierung nicht. Was passiert, wenn das Script aus dem Editor gestartet wird?

Wenn ich das Skript im Editor starte passiert das hier:

Und was bitte steht im Log vom Script? Lass Dir doch nicht jedes Detail einzeln aus der Nase ziehen…

Im Log steht das hier:

Sorry hatte ich vergessen anzuhängen, war keine Absicht :o

Damit kann ich doch mal was Anfangen. Das Actor Script verwendet die Variablennamen vom neuen Reader script, die sich geändert haben Bitte in Zeile 57ff den Namen anpassen oder den ganzen Block auskommentieren:

$name=IPS_GetName($me);
if ($name != „Status“) {
IPS_LogMessage(„FritzAHA Switch“,"Error: Action from wrong variable ".$me);
return;
}

So hab das Skript, so angepasst das ich das ab Zeile 60 auskommentiert habe:

<?php
/*
switch a Fritz AHA Device (Fritz Powerline 546E, Fritz Dect200) from IPSymcon
http://www.tdressler.net/ipsymcon
V2.2 16.01.2016
see also
http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/AVM_Technical_Note_-_Session_ID.pdf
http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/AHA-HTTP-Interface.pdf
*/
if (!function_exists('mb_convert_encoding')) {
   IPS_LogMessage ("FritzAHA Switch","Error:Need mbstring_extension!
");
   return;
}
if (!function_exists('simplexml_load_string')) {
   IPS_LogMessage("FritzAHA Switch","Error:Need SimpleXML functions(simplexml_load_string)!
");
   return;
}

/* config section, pls adopt this for your device
credential array array('<1.host/ip>' =>array('user'=>'<login name1>','password'=>'<secret>')
                      ,'<2.host/ip>' =>array('user'=>'<login name2>','password'=>'<secret2>')
                      ,..
                     );
if no login name is needed/applicable, set the name to an empty string ('')!
*/
$logins=array('172.16.1.2'=>array('user'=>'','password'=>'start') //sample entry for fritzbox
/*           ,'192.168.170.211'=>array('user'=>'','password'=>'xyz123') //sample entry for another host,maybe fritz546 */
        );

$id=31887 /*[FRITZ Smarthome\ TV Beleuchtung\Status]*/; //test variable for execute
/* end config section */

//check caller
$sender=$_IPS['SENDER'];
switch ($sender) {
case "WebFront":
  $me=$_IPS['VARIABLE'];
  $val=$_IPS['VALUE'];
   SetValue($me, $val); //doing will be done by variable change
   return;
  break; //not reached
case "Variable":
  $me=$_IPS['VARIABLE'];
  $val=$_IPS['VALUE'];
  break;
case "Execute":
  $me=$id;
  $val=@GetValue($me);
  break;
default:
  IPS_LogMessage("FritzAHA Switch", "Error: unknown Sender '$sender'");
  return;
}

$state=$val;
IPS_LogMessage("FritzAHA Switch","Switch ID ".$me." to ".($state?'ON':'OFF'));

/*
//check varable is right
$name='fritz_aha_reader';
if ($name != "Switch Status") {
  IPS_LogMessage("FritzAHA Switch","Error: Action from wrong variable ".$_IPS['VARIABLE']);
  return;
}

//get parameter from IPS
$parent=IPS_GetParent($me);
$host=getVarValue('Device Host',$parent);
$ain=getVarValue('Device AIN',$parent);

//checks
if (!$host || !$ain) {
  IPS_LogMessage("FritzAHA Switch","Error: Parameter host($host) or AIN($ain) missed");
  return;
}

//get password using ID host
$username=$logins[$host]['user'];
$password=$logins[$host]['password'];
if (!$password) {
  IPS_LogMessage("FritzAHA Switch","Error: password for '$host' not defined");
  return;
}

//build urls and login
$loginurl="http://".$host."/login_sid.lua";//login_sid.lua for fritzos 5.50+
$ahaurl="http://".$host."/webservices/homeautoswitch.lua";//api url
$sid=get_sid($loginurl,$username,$password);
if (!isset($sid)) {
  IPS_LogMessage("FritzAHA Switch", "Error: Login invalid or failed");
  return;
}

//query actual state
$url=$ahaurl.'?ain='.rawurlencode($ain).'&sid='.$sid.'&switchcmd=getswitchstate';
$answer=chop(@file_get_contents($url));
$response=$http_response_header[0];
if (!preg_match("/200\s+OK$/",$response)){
  IPS_LogMessage("FritzAHA Switch", "Error: Query ($url) failed, Response: $response ");
  return;
}
IPS_LogMessage("FritzAHA Switch", "Actor $ain actual state:".($answer?"ON":"OFF"));
if ((($answer=="1")!=$state) || ($sender == "Execute")) {
//execute query
  $cmd=($state==true)?'setswitchon':'setswitchoff';
  IPS_LogMessage("FritzAHA Switch", "Actor $ain execute cmd:".$cmd);
  $url=$ahaurl.'?ain='.rawurlencode($ain).'&sid='.$sid.'&switchcmd='.$cmd;
  $answer=@file_get_contents($url);
  $response=$http_response_header[0];
  if (!preg_match("/200\s+OK$/",$response)) {
     IPS_LogMessage("FritzAHA Switch", "Error: Update Actor $ain failed, Response: $response");
     return;
  }
  IPS_LogMessage("FritzAHA Switch", "New Status for Actor $ain:".($answer?"ON":"OFF"));
}else{
   IPS_LogMessage("FritzAHA Switch", "No need to switch Actor $ain");
}
*/
//-------------------------------------------------------------------------------
/**
  * login into fritz and get sid
  * @param string loginurl url for accessing device
  * @param string username Username to login, if needed or empty
  * @param string password password for login
  * @return string sid
  */
function get_sid ($loginurl,$username,$password) {

 if (is_null($username)) $username='';
 $sid='';
 // get challenge string
 $http_response = file_get_contents($loginurl);
 $response=$http_response_header[0];
 if (preg_match("/200\s+OK$/",$response)) {
  $xml = simplexml_load_string($http_response);
  $challenge=(string)$xml->Challenge;
  $sid=(string)$xml->SID;
 }else{
   IPS_LogMessage("FritzAHA Switch", "Error: GetSid with $loginurl failed, Response: $response");
 }
 if ((strlen($sid)>0) && (preg_match("/^[0]+$/",$sid)) && $challenge) {
     //sid is null, got challenge
    $sid="";
    //build password response
    $pass=$challenge."-".$password;
    //UTF-16LE encoding as required
    $pass=mb_convert_encoding($pass, "UTF-16LE");
    //md5hash on top
    $md5 = md5($pass);
    //final answer string
    $challenge_response = $challenge."-".$md5;
    //send to box
    $url=$loginurl."?username=".$username."&response=".$challenge_response;
   $http_response = file_get_contents($url);
   //check answer
   $xml = simplexml_load_string($http_response);
   $sid=(string)$xml->SID;
   if ((strlen($sid)>0) && !preg_match("/^[0]+$/",$sid)) {
            //is not null, bingo!
            return $sid;
   }

 }else {
  //use existing sid if $sid matches an hex string
  if ((strlen($sid)>0) && (preg_match("/^[0-9a-f]+$/",$sid))) return $sid;
 }
 return null;
}//function

//-------------------------------------------------------------------------------
/**
* get varable value by name referencing parent
* @param string $name Name of variable
* @param integer $par ID of parent (category)
* @return variant value of selected variable or null
*/
function getVarValue($name,$par) {
  $value=null;
  $vid = @IPS_GetVariableIDByName($name, $par);
  if ($vid)
    $value=GetValue($vid);
  return $value;
}
?>

Jetzt kommt im Log auch keine Meldung mehr , aber es passiert leider immer noch nix :frowning: