Hallo zusammen
es geht mal wieder weiter.
Heute mit dem Uhrzeitstellen (0016) und dem Auslesen des Logspeicher der einzelnen Circle (0048).
Ist natürlich mal wieder ganz einfach wenn man weiß wie
Hab von Anfang an zwar Werte auf 0049 erhalten, aber die haben irgendwie nie zu den erwarteten Datumsangaben/Wattzahlen gepasst. Die Logadresse wars die mich fast zum verzweifeln gebracht hat.
Aber jetzt erstmal zum Uhrzeitstellen der einzelnen Plugs.
Dafür braucht man „nur“ 0016+Macadresse+Jahr+Monat+Minuten seit beginn des Monats+8xF(Hiermit kann man anscheinend den Logspeicher löschen können, aber 8xF ist nicht der Befehl zum löschen und ich weiß auch nicht wie der Befehl lautet, aber den brauchen wir ja auch nicht)+Aktuelle Stunde+Minuten+Sekunden+Tag der Woche+CRC.
Hier mein Script zum Stellen aller Circle. Dazu einfach die Macadresse bei $anfang abändern(sollte aber eigentlich gleich sein), in $id_array die letzten 7stellen der Macadressen eingeben und unten eure Registervariable eintragen :
<?
function makeCrcCheckSum($string)
{
$crc = 0x0000;
for ($i = 0, $j = strlen($string); $i < $j; $i++) {
$x = (($crc >> 8) ^ ord($string[$i])) & 0xFF;
$x ^= $x >> 4;
$crc = (($crc << 8) ^ ($x << 12) ^ ($x << 5) ^ $x) & 0xFFFF;
}
//$ausgabe = str_pad($ausgabe, 4 ,'0', STR_PAD_LEFT); //Mit Nullen auffüllen
return str_pad(strtoupper(dechex($crc)), 4 ,'0', STR_PAD_LEFT);
}
function pwdatum()
{
$jahr=str_pad(strtoupper(dechex(date("y"))), 2 ,'0', STR_PAD_LEFT);
$monat=str_pad(strtoupper(dechex(date("m"))), 2 ,'0', STR_PAD_LEFT);
$mingesamt=str_pad(strtoupper(dechex(((date("j")-1)*24+(date("G")))*60+date("i"))), 4 ,'0', STR_PAD_LEFT);
$logzurueck = 'FFFFFFFF';
$h=str_pad(strtoupper(dechex(date("G"))), 2 ,'0', STR_PAD_LEFT);
$m=str_pad(strtoupper(dechex(date("i"))), 2 ,'0', STR_PAD_LEFT);
$s=str_pad(strtoupper(dechex(date("s"))), 2 ,'0', STR_PAD_LEFT);
$dow=str_pad(strtoupper(dechex(date("N"))), 2 ,'0', STR_PAD_LEFT);
return($jahr.$monat.$mingesamt.$logzurueck.$h.$m.$s.$dow);
}
$anfang="000D6F000"; //Anfang der Mac Adresse
$id_array=array( "0B1xxxF",
"0D3xxx5",
"0D3xxx8",
"0D3xxxC",
"0D3xxxB",
"0D3xxx6",
"0D3xxxB",
//........
//........
//........
"1B3xxxA"); //Hier alles IDs eintragen
$anzahl = count($id_array);
for ($i=0;$i<$anzahl;$i++)
{
$mac=$anfang.$id_array[$i];
$befehl = "0016"; //Uhrzeitstellen
$mac.=pwdatum();
$text=$befehl.$mac;
$ausgabe=makeCrcCheckSum($text);
$text.= $ausgabe;
IPS_sleep(300);
RegVar_SendText(56849 /*[Test neu\Plugwise\Register Variable Cutter Plug]*/,"\x05\x05\x03\x03".$text."\x0D\x0A");
}
?>
Als Antwort kommt vom Stick 0000E31600D7000D6F0000B1xxxA916E
00D7 ist die Info das der Circle seine Uhrzeit umgestellt hat. (Siehe mein Empfangsscript weiter unten)
So jetzt aber zum 0048/0049 Logauslesen
Dazu brauchen wir ersteinmal die aktuelle Logadresse des Circle (ist bei jedem Circle anders)
Abfragen mit 0023:
<?
function makeCrcCheckSum($string)
{
$crc = 0x0000;
for ($i = 0, $j = strlen($string); $i < $j; $i++) {
$x = (($crc >> 8) ^ ord($string[$i])) & 0xFF;
$x ^= $x >> 4;
$crc = (($crc << 8) ^ ($x << 12) ^ ($x << 5) ^ $x) & 0xFFFF;
}
//$ausgabe = str_pad($ausgabe, 4 ,'0', STR_PAD_LEFT); //Mit Nullen auffüllen
return str_pad(strtoupper(dechex($crc)), 4 ,'0', STR_PAD_LEFT);
}
$mac="000D6F000";
$cid="0D3xxx7"; //Kühlschrank
$mac=$mac.$cid;
$befehl = '0023';
$text=$befehl.$mac;
$ausgabe=makeCrcCheckSum($text);
$text.= $ausgabe;
RegVar_SendText(56849 /*[Test neu\Plugwise\Register Variable Cutter Plug]*/,"\x05\x05\x03\x03".$text."\x0D\x0A");
?>
Auch hier wieder eure Daten eingeben und ausführen.
Zum auslesen der Logadresse hier mein gesamtes aktuelles Empfangsscript :
<?
$Plugwisekat = 48691 /*[Test neu\Plugwise]*/;
function bintofloat($in)
{
$in=hexdec($in);
$binary = str_pad(decbin($in),32,"0", STR_PAD_LEFT);
$fb = $binary[0];
$exp = bindec(substr($binary, 1, 8));
$m = bindec(substr($binary, 9, 23));
return pow(-1,$fb) * (1+$m/(pow(2,23))) * pow(2,$exp-127);
}
function pulsetowatt($pu,$s,$ga,$gb,$offr,$offo) //Pulse,Sekunden,gaina,b,offruis,offtot
{
if (($pu>0))
{
$va = $pu/$s;
$out = (pow(($va+$offr),2)*$gb)+(($va+$offr)*$ga)+$offo;
$wh = (($out ) / 468.9385193)*1000;
}
else
$wh=0;
return $wh;
}
function pwdatetodate($pwdate)
{
$jahr = 2000+hexdec(substr($pwdate,0,2));
$monat =hexdec(substr($pwdate,2,2));
$stunden = (hexdec(substr($pwdate,4,4))/60);
$min=(hexdec(substr($pwdate,4,4))%60);
$tag=floor(1+($stunden/24));
$h = ($stunden%24);
return $jahr." ".$monat." ".$tag." ".$h." ".$min;
}
if ($IPS_SENDER == "RegisterVariable")
$buf = $IPS_VALUE;
switch ((substr($buf,0,4)))
{
case "0000": //Befehl vom Stick empfangen
switch ((substr($buf,8,4)))
{
case "00C1": //alles empfangen
// print "Befehl von Stick empfangen";
break;
case "00D8": //eingeschaltet
//print "Eingeschaltet MAC".substr($buf,12,16);
$KatID = IPS_GetObjectIDByIdent(substr($buf,12,16),$Plugwisekat);
setvalueboolean(IPS_GetObjectIDByIdent("Status",$KatID),true);
//IPS_RunScript(54091 /*[Test neu\Plugwise\Plug Strom auslesen lassen]*/);
break;
case "00D7": //Uhrzeitgestellt
print "Uhrzeit gestellt MAC".substr($buf,12,16);
//IPS_RunScript(54091 /*[Test neu\Plugwise\Plug Strom auslesen lassen]*/);
break;
case "00DE": //ausgeschaltet
//print "Ausgeschaltet MAC".substr($buf,12,16);
$KatID = IPS_GetObjectIDByIdent(substr($buf,12,16),$Plugwisekat);
setvalueboolean(IPS_GetObjectIDByIdent("Status",$KatID),false);
//IPS_RunScript(54091 /*[Test neu\Plugwise\Plug Strom auslesen lassen]*/);
break;
case "00E1": //Befehl nicht am Circle angekommen
print "Achtung Befehl nicht vom Circle bestätigt";
break;
default:
print "Fehler von Stick"; //bei allem anderen
}
break;
case "0011": // Init
print "Die Sequenznr: ".substr($buf,4,4)."
";
print "MC Adresse: ".substr($buf,8,16);
break;
case "0013": //Verbrauch
// print "Die Sequenznr: ".substr($buf,4,4)."
";
// print "MC Adresse: ".substr($buf,8,16)."
";
// print "Pulse/s : ".substr($buf,24,4)."
";
// print "Pulse/8s: ".substr($buf,28,4)."
";
// print "Pulse gesamt: ".substr($buf,32,8)."
";
$KatID = IPS_GetObjectIDByIdent(substr($buf,8,16),$Plugwisekat);
$gaina = getvaluefloat(IPS_GetObjectIDByIdent("Gaina",$KatID));
$gainb = getvaluefloat(IPS_GetObjectIDByIdent("Gainb",$KatID));
$offot= getvaluefloat(IPS_GetObjectIDByIdent("Offot",$KatID));
$offruis=getvaluefloat(IPS_GetObjectIDByIdent("Offruis",$KatID));
$pulse = hexdec(substr($buf,28,4));
if ($pulse==65535 /*[Objekt #65535 existiert nicht]*/)
$watt=0;
else
$watt= pulsetowatt($pulse,8,$gaina,$gainb,$offruis,$offot);
setvaluefloat(IPS_GetObjectIDByIdent("Watt",$KatID),$watt);
$pulsegesamt = hexdec(substr($buf,32,8));
setvaluefloat(IPS_GetObjectIDByIdent("Pulsegesamt",$KatID),$pulsegesamt);
$kwh= pulsetowatt($pulsegesamt,3600,$gaina,$gainb,$offruis,$offot);
setvaluefloat(IPS_GetObjectIDByIdent("kWh",$KatID),$kwh);
break;
case "0019": //Auslesen der MAC adressen
print "Die Sequenznr: ".substr($buf,4,4)."
";
print "MC Circle+: ".substr($buf,8,16)."
";
print "MAC Circle : ".substr($buf,24,16)."
";
print "Node ID: ".substr($buf,40,2)."
";
break;
case "0024": //Info
print "Die Sequenznr: ".substr($buf,4,4)."
";
print "MC Adresse: ".substr($buf,8,16)."
";
// print "Jahr : ".substr($buf,24,2)."
";
// print "Monat: ".substr($buf,26,2)."
";
print "Datum : ".pwdatetodate(substr($buf,24,8))."
";
$logAddress = substr($buf, 32, 8);
print "log Adresse: ".$logAddress."
";
print "An/aus: ".substr($buf,40,2)."
";
print "Herz (85=50H): ".substr($buf,42,2)."
";
print "Hardwareversion: ".substr($buf,44,12)."
";
print "Softwareversion: ".substr($buf,56,8)."
";
print "Stick 00,Cir+ 01 Cir 02: ".substr($buf,64,2)."
";
$KatID = IPS_GetObjectIDByIdent(substr($buf,8,16),$Plugwisekat);
if(substr($buf,40,2)=="01") //gerät an/aus
setvalueboolean(IPS_GetObjectIDByIdent("Status",$KatID),true);
else
setvalueboolean(IPS_GetObjectIDByIdent("Status",$KatID),false);
break;
case "0027": //Kalibrierung
print "Die Sequenznr: ".substr($buf,4,4)."
";
print "MC Adresse: ".substr($buf,8,16)."
";
print "gaina : ".substr($buf,24,8)."
";
print "gainb: ".substr($buf,32,8)."
";
print "offtot : ".substr($buf,40,8)."
";
print "offnoise: ".substr($buf,48,8)."
";
$KatID = IPS_GetObjectIDByIdent(substr($buf,8,16),$Plugwisekat);
setvaluefloat(IPS_GetObjectIDByIdent("Gaina",$KatID),bintofloat(substr($buf,24,8)));
setvaluefloat(IPS_GetObjectIDByIdent("Gainb",$KatID),bintofloat(substr($buf,32,8)));
setvaluefloat(IPS_GetObjectIDByIdent("Offot",$KatID),bintofloat(substr($buf,40,8)));
if (substr($buf,48,8)=="00000000")
setvaluefloat(IPS_GetObjectIDByIdent("Offruis",$KatID),0);
else
setvaluefloat(IPS_GetObjectIDByIdent("Offruis",$KatID),bintofloat(substr($buf,48,8)));
break;
case "0049": //Logauslesen
//print "nr: ".$buf."
";
// print "Die Sequenznr: ".substr($buf,4,4)."
";
//print "MC Adresse: ".substr($buf,8,16)."
";
/*
print "logdate1: ".substr($buf,24,8)."
";
print "logvalue1 : ".substr($buf,32,8)."
";
print "logdate2: ".substr($buf,40,8)."
";
print "logvalue2 : ".substr($buf,48,8)."
";
print "logdate3: ".substr($buf,56,8)."
";
print "logvalue3 : ".substr($buf,64,8)."
";
print "logdate4: ".substr($buf,72,8)."
";
print "logvalue4 : ".substr($buf,80,8)."
";
print "Logadresse: ".$logAddress."
";
*/
$KatID = IPS_GetObjectIDByIdent(substr($buf,8,16),$Plugwisekat);
$gaina = getvaluefloat(IPS_GetObjectIDByIdent("Gaina",$KatID));
$gainb = getvaluefloat(IPS_GetObjectIDByIdent("Gainb",$KatID));
$offot= getvaluefloat(IPS_GetObjectIDByIdent("Offot",$KatID));
$offruis=getvaluefloat(IPS_GetObjectIDByIdent("Offruis",$KatID));
//ersten Wh wert auslesen
echo pwdatetodate(substr($buf,24,8));
$pulsegesamt = hexdec(substr($buf,32,8));
$wh= pulsetowatt($pulsegesamt,3600,$gaina,$gainb,$offruis,$offot);
print " Wh = ".$wh."
";
//Zweiten Wh wert auslesen
echo pwdatetodate(substr($buf,40,8));
$pulsegesamt = hexdec(substr($buf,48,8));
$wh= pulsetowatt($pulsegesamt,3600,$gaina,$gainb,$offruis,$offot);
print " Wh = ".$wh."
";
//dritten Wh wert auslesen
echo pwdatetodate(substr($buf,56,8));
$pulsegesamt = hexdec(substr($buf,64,8));
$wh= pulsetowatt($pulsegesamt,3600,$gaina,$gainb,$offruis,$offot);
print " Wh = ".$wh."
";
//vierten Wh wert auslesen
echo pwdatetodate(substr($buf,72,8));
$pulsegesamt = hexdec(substr($buf,80,8));
$wh= pulsetowatt($pulsegesamt,3600,$gaina,$gainb,$offruis,$offot);
print " Wh = ".$wh."
";
break;
case "003F": //Uhrzeit auslesen
print $buf."
";
print "Die Sequenznr: ".substr($buf,4,4)."
";
print "MC Adresse: ".substr($buf,8,16)."
";
print "Stunde : ".hexdec(substr($buf,24,2))."
";
print "Min: ".hexdec(substr($buf,26,2))."
";
print "Sek : ".hexdec(substr($buf,28,2))."
";
print "Tag der Woche: ".substr($buf,30,2)."
";
print "Rest : ".substr($buf,32,2)."
";
print "Rest2: ".substr($buf,34,10)."
";
break;
}
?>
Die Logadresse wird zurzeit nur angezeigt und nirgends abgespeichert. Also Logadresse aufschreiben und im Logabfragescript eintragen.
Mit 0048+Macadresse+Logadresse+CRC liefert der Circle 4 mal das Logdatum (Jahr,Monat und Stunden seit Monatsbeginn) und den dazugehörigen Verbrach in der Stunde.
Wenn wir jetzt die aktuelle Logadresse abfragen bekommen wir nur Zufalszahlen zurück, da der Circle die Aktuelle und die zukünftigen 3 Stunden ausgibt. Fragt mich nicht wieso man sowas macht.
Um an geloggte Daten zu kommen muss man von der Logadresse pro Stunde zurück 8 abziehen.
In meinem Abfrage Script gibt man bei $bereich an wieviele Stunden man zurück will. Für den Verbrauch der Letzen 4 Stunden also 4 usw.
<?
function makeCrcCheckSum($string)
{
$crc = 0x0000;
for ($i = 0, $j = strlen($string); $i < $j; $i++) {
$x = (($crc >> 8) ^ ord($string[$i])) & 0xFF;
$x ^= $x >> 4;
$crc = (($crc << 8) ^ ($x << 12) ^ ($x << 5) ^ $x) & 0xFFFF;
}
//$ausgabe = str_pad($ausgabe, 4 ,'0', STR_PAD_LEFT); //Mit Nullen auffüllen
return str_pad(strtoupper(dechex($crc)), 4 ,'0', STR_PAD_LEFT);
}
$mac="000D6F000"; //Anfang der Mac Adresse
$cid="0D3xxx7"; //Kühlschrank Rest der Mac Adresse
$mac=$mac.$cid;
$befehl = '0048';
$aktuellelogadresse = '00045F28'; //auslesen mit 0023
$bereich = 4; // Hier einstellen welches Vierstundenlog ausgelesen werden sollen (angeblich bis zu einem Jahr zurück)
$mac.=$logadresse=str_pad(strtoupper(dechex(hexdec($aktuellelogadresse)-8*$bereich)), 8 ,'0', STR_PAD_LEFT);
$text=$befehl.$mac;
$ausgabe=makeCrcCheckSum($text);
$text.= $ausgabe;
RegVar_SendText(56849 /*[Test neu\Plugwise\Register Variable Cutter Plug]*/,"\x05\x05\x03\x03".$text."\x0D\x0A");
?>
Daraufhin liefert das Empfangsscript im Meldungsfenster
2012 3 20 0 Wh = 32.21565431
2012 3 21 0 Wh = 33.32548651
2012 3 22 0 Wh = 30.32165421
2012 3 23 0 Wh = 35.65465421
Also erst das Jahr 2012 dann den Monat 3 und die Stunde 20 - 23. Die 0 ist die Minute hier eigentlich unnötig, hab ich aber in der Funtkion pwdatetodate drin und die wird bei 0024 gebraucht. Dann die Wattstunden und das ganze natürlich 4 mal.
So hoffe Ihr kommt damit zurecht und Ihr könnt das verwenden.
Gruß Jannis