Plugwise ohne Server direkt auslesen/schalten

Bitte mehr Feedback und Wünsche. Oder interessieren sich nur Wuppi, Jannis und ich für Plugwise?

Doch, Interesse besteht. Mit geht es aber wie Powerfreddy - ich habe keine Not weil die Lösung über den Plugwise-Server funktioniert und andere Dinge bei einem knappen Zeitkonto eine höhere Priorität haben.

Ja,
ich hatte das schon in meinem Plugwise Dienst umgesetzt.
Leider habe ich im Augenblick keine Zeit für die Weiterentwicklung.

Hier mal ein paar Codezeilen aus dem Server, müsstest du nur nach php umsetzten.


@param calibration	Circle calibration settings
@param pulses	pulse count over period
@param period	period in seconds
@return		corrected pulse count
*/
public float getPower(Calibration calibration, int pulses,
int period) {
float power = 0.0f;				// assume no power consumed
if (period > 0) {				// non-zero period?
  if (pulses != 0 &&			// meaningful pulse count?
  pulses != 65535 && pulses != -1) {
float gainA = calibration.getGainA();	// get Circle gains and offsets
float gainB = calibration.getGainB();
float offsetNoise = calibration.getOffsetNoise();
float offsetTotal = calibration.getOffsetTotal();
float pulsesAverage =			// get pulses per second
  ((float) pulses) / period;
float pulsesOffsetNoise =		// correct pulses for noise
  pulsesAverage + offsetNoise;
float pulsesCorrected =			// correct pulses for gains
  pulsesOffsetNoise * pulsesOffsetNoise * gainB +
  pulsesOffsetNoise * gainA + offsetTotal;
power = PULSE_FACTOR * pulsesCorrected; // get power in watts
  }

------------------------------------------


String response =			// get power buffer response
  sendCommand(POWER_BUFFER_REQUEST, circleAddress, logAddressString);
if (response != null) {			// response received?
  // int year = getInt(response, 20, 2) + 2000; // get year
  // int month = getInt(response, 22, 2); // get month
  int minutes = getInt(response, 24, 4);// get minutes from month start
  String time = getTime(minutes);	// get time from minutes
  int pulses =				// get pulses for last buffer
    getInt(response, 28, 8);
  int energyConsumption =		// get power for last power
    Math.round(getPower(calibration, pulses, 3600));
-------------------------------------------------




Belmondo, soll das den aktuellen oder den Gesamtverbrauch auswerten?

Danke & Gruß, Axel

Moinsen,

also das kann ja zwei Gründe haben

  1. Circle nicht erreichbar ?!?!
  2. Hast du deine Script geändert ?!?!
    SetValueString(CreateVariable(„NetworkID“, 3, IPS_GetParent($IPS_SELF),0,""),substr($buf,8,9));
    Schau mal ob du da nicht auch nen Circle mit 000D6F0001 statt 000D6F0000 hast. Bei der Variante müsstes du dann noch vor die sechstellige ID die 1 oder 0 packen.

Jannis, Wuppi,

„Befehl nicht vom Circle bestätigt…“ kommt ja, wenn der MC „00E1“ auf ein Befehl zurück gibt. Ich bekomme die Meldung immer 2x auf meine Anfrage wieviel Watt gerade verbraucht werden und lustigerweise sind dann auch genau 2 Circles ausgeschaltet. Maarten Damen schreibt dazu nichts. Also Circle ausgeschaltet oder nicht erreichbar - kann es so einfach sein? Jannis, hast du das herausgefunden?

Danke & Gruß,
Axel

Korrektur: meine Frau hat ein Circle ausgesteckt und mein Skript fragt Status in Verbrauch ab. Daher einfach Nichterreichbarkeit…

ach wie schön :0) Das sind unsere Frauen ;0)

Hallo zusammen,

sodele, nachdem ich eine Weile weg war, konnte ich mich auch mal wieder mit diesem Thema auseinandersetzen.

Mir hat es sehr viel gebracht, da ich hier mittlerweile 2 Plugwise-Netze am Laufen habe, einmal über Source und einmal unten im Keller über USB-Fernanschluss an einer FB7170 und mit Hilfe eurer Entwicklung. An dieser Stelle erstmal vielen Dank an euch, die ihr so fleissig entwickelt habt!

Es funktioniert alles einwandfrei und genauso, wie ich es mir vorgestellt habe. Das wollte ich wenigstens mal mitteilen :slight_smile:

Grüße
Grebi

Habe fleissig weiter entwickelt, hänge jetzt aber an IPS-kompatiblem Gesamtverbrauch fest. Aktuell schreibe ich den Gesamtverbrauch in Pulsen (pro Stunde) in eine Variable, errechne das Delta zur vorheigen Messung, konvertiere das in kWh (wie Watt, nur geteilt durch 3600 statt mit 1000 multiplizieren) und addiere das zum Gesamtverbrauch.

Meine Beobachtung zeigt, dass die Werte einigermassen stimmen, aber immer etwas niedriger als im Source sind. Liegt sicher daran, dass auf diese Weise bei der Stundenumstellung ein Paar Pulses nicht gemessen werden. Ich könnte jetzt den Databuffer der letzten Stunde als Korrektur heranziehen - das macht die Sache aber kompliziert. Auslesen im Nachhinein hat ausserdem den negativen Seiteneffekt, dass die Werte nicht mehr zur richtigen Zeit in IPS geloggt werden können.

Kann mir jemand folgen und hat evtl. sogar eine zündende Idee dazu?

Spiele mit dem Gedanken, die Werte woanders hinzuschreiben (Mysql?), doch dann verlagert sich dass Problem in die Auswertung/Graphen. Rein in IPS wäre schon deutlich schicker!

Danke & Gruß, Axel

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 :wink:

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 :wink: 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

Hallo Jannis,

ich bin auch gerade daran. Ein Paar Schweinereien sind mir dabei aufgefallen:

  1. Die Circles laufen intern mit der Zeitzone UTC (siehe Plugwise Protocol Analysis, Part 1 « roheve), daher der Versatz. Klar kannst du die Clock der Circles einfach auf MEZ stellen, dann dürfte aber die Source-Software durcheinanderkommen. Letzteres fand ich immer hilfreich zur Kontrolle.

  2. Ich speicher mir die LogAdresse pro Circle dezimal weg, Umrechnung in Hex ist ja bekannt. Kontrolle über Source zeigt mir richtige Werte. Und trotzdem bekomme ich beim Abfragen der Buffer über 0048 komische Ergebnisse: bei manchen Circles bekomme ich ein Verbrauchswert für die richtige Zeit, mal 2 (zur gleichen Zeit!) und mal keinen (Datum 01.01.1970).

Update: ergibt jetzt Sinn, da die jeweiligen Logadressen nicht immer die 4 gleichen Stunden betrachten

Ausserdem hinkt das ganze - warum auch immer - genau ein Tag zurück.

Update: meine Zeitumrechnung war falsch!

  1. Das Thema Gesamtverbrauch ist in Zusammenhang mit IPS recht schwierig abzubilden. Den Buffer kann man nicht wirklich benutzen, da IPS-Variablen ja nur zur aktuellen Zeit geloggt werden können, der Buffer der Circles aber historische Werte darstellt. Hat schon jemand eine Lösung für dieses logische Problem?

  2. Zeit auslesen geht bei mir einwandfrei (man bekommt halt UTC zurück), aber …

  3. Zeit stellen geht bei mi nicht Ich bekomme immer „Fehler vom Stick“ zurück. Halte mich an dabei an Maarten’s Beschreibung, aber auch mit deinem Skript geht es nicht. Komische Sache…
    Update: ich Dummerchen muß auch die Antwort auswerten, „Fehler vom Stick“ ist die Standardantwort…:rolleyes:

Und Jannis: wir sollten wirklich versuchen gemeinsam an der Sache weiter zu entwickeln. Was hälst du davon das ganze auf Basis der IPSLibrary zu machen?

Danke & Gruß,
Axel

Hallo!

Ich bin jetzt auch mal zum testen gekommen. Eine Stolperfalle hatte ich

function SendPlugwiseCommand($cmd, $REGVAR)
{
	$ausgabe=dechex(calculate_common_crc16c($cmd));
	$ausgabe = str_pad($ausgabe, 4 ,'0', STR_PAD_LEFT); //mit nullen auffüllen
	$cmd.= $ausgabe;
	 //PRINT "Koammdo" .$cmd;
	RegVar_SendText($REGVAR,"\x05\x05\x03\x03".$cmd."\x0D\x0A");
	Sleep(4);
}

aus dem Sleep(4) habe ich Sleep(1) gemacht. Funktioniert auch, und das Script laeuft nicht mehr laenger als 30sek.

Um per Variable zu schalten habe ich folgende Aenderung gemacht

	Case "Variable":
	Case "WebFront":
	   // Zum schalten im Webfront
	   $id = IPS_GetParent($_IPS['VARIABLE']);
		$id_info = IPS_GetObject($id);
		if ($_IPS['VALUE'] == 1) {$action = 1;} else {$action = 0;}
		$cmd = "0017".$NetworkID.$id_info['ObjectInfo']."0".$action;
	   SendPlugwiseCommand($cmd,$REGVAR);

		// Sofort Feedback geben - aber besser auskommentieren und auf Rückmeldung des Circles warten
	   // SetValueBoolean($_IPS['VARIABLE'], $_IPS['VALUE']);

		break;

und einen Variablentrigger auf Wertaenderung der State Variablen hinzugefuegt.

Gruss, Michael

Hallo Axel

Gemach, Gemach.

Hab heute mein Basis-Set mit Erweiterung bestellt (15% Discount mit Code: SP!TS2012).

Also bin ich bald auch dabei. :slight_smile:

Gruss, Andreas

Bin bereits ein gutes Stück weiter gekommen, vor allem beim Thema Gesamtverbrauch. Frage die Circles jetzt jede Minute ab und addiere das Delta der Pulses pro Stunde auf den Gesamtverbrauch. Im Vergleich zu Source sind unterschiede nur marginal. Nichtsdestotrotz würde ich gerne den Buffer abfragen, dann würden die Verbrauchswerte aber in IPS zur falschen Zeit, nämlich immer zur aktuellen geloggt. Das Thema Buffer auslesen ist 100% geklärt und Feature-Request zum loggen von Werten zu beliebigen Zeiten läuft (mal sehen was daraus wird). Alternative wäre die Nutzung einer anderen Datenbank, aber dann wäre das Skript nicht mehr universell einsetzbar.

Setzen der Uhrzeit ist auch implementiert.

Nice to have wäre noch das Tracking der Session-Codes, damit könnte man nicht erreichbare Circles direkt in IPS darstellen. Aber 1) kann man kurzfristig die Source Software zum testen starten und 2) ist - zumindest mein Plugwise-Netz - sehr stabil. Wenn mal ein Circle nicht erreichbar ist, dann liegt es meist daran, dass jemand den Circle aus der Steckdose entfernt hat… Grmpf!

Schliesslich trage ich den Gedanken, das Skript in der IPSLibrary zu veröffentlichen. Ach wenn ich doch nur mehr Zeit hätte!

Schreibt doch mal eure Gedanken bzw. ob es Interesse am Zwischenstand des Skripts gibt.

Danke & Gruß, Axel

Verfolge das Projekt sehr interessiert, da ich im Herbst darüber die Steuerung meiner Stromdirektheizung umsetzen möchte. Danke für Deine Arbeit!

Für mein Vorhaben wäre das Problem des Stromausfalls natürlich äußerst relevant! Lässt sich das was machen? :wink:

Grüße
galleto

Hi galleto,

meines erachtens nicht in Plugwise, da „by design“. Blöderweise haben die Circles ja kein Schalter, daher ist das Aus- und wieder Einstecken die manuelle Alternative zum Schalten. Nicht ganz zu Ende gedacht…

Anyway: evtl. kann man mit IPS nach einem Stromausfall wieder den Ausgangszustand wiederherstellen. Bedingt eine USV für IPS…

Anders gerfragt: was wollt ihr denn alles anschliessen? Ich schalte eigentlich nur mein Drucker und Soundbridge on-/offline. Darüberhinaus habe ich zwar noch 16 weitere Circles, die daran hängenden Geräte sind aber eigentlich immer besaftet. Vielmehr versuche ich eine Logik aus dem Verbrauch zu ziehen, bspw. Melder für Wasch-/Spülmaschine fertig oder Media Center stoppen, wenn TV aus ist. Also ich kann mit dem Verhalten nach Stromausfall zumindest leben…

Danke & Gruß,
Axel

Hallo Axel,

hört sich alles sehr gut an, leider konnte noch noch nichts testen bzw. umbauen. Im Sommer … :o

Danke trotzdem für Deine Arbeit.

It’s not a bug, … :cool:

Laut Aussage von Plugwise wird das Einschaltverhalten vielleicht in einer kommenden Firmware-Version einstellbar sein.

Gruß
Bruno

Hallo Jannis, hallo Wuppi, hallo Axel und

alle anderen die mitarbeiten. Toller Job und gute Ideen in den Scripten - super.

Ich habe bisher mein Plugwise über den Plugwise-Server gesteuert - alles prima. Jetzt will ich ohne den Server auskommen und teste daher die Scripte aus diesem Thread.

Soweit bin ich gekommen:

  • serielle Verbindung aufgebaut
  • RegVar angelegt
  • Script zum Anlegen der Circles
  • Test-Script zum Absetzen einzelner Befehle
  • allgemeines Script (Auswertung)

Das Auswerte-Skript hakt noch, da muss ich noch debuggen - kein Problem.

Aber das Schalten eines Circles über 0017 bekomme ich nicht hin, obwohl das Debug-Fenster des SeriellPort die passenden HexWerte gemäß der Protokoll-Doku von Maarten Damen zeigt (meine ich zumindest).

Es fehlt sicher nur eine Kleinigkeit, aber ich habe den Thread nun schon ein dutzentmal vor und zurück gelesen, aber ich kann meinen Fehler nicht finden. Hat jemand das Werkzeug um mein Brett vor dem Kopf zu entfernen?

Der Debug-Screenshot ist anbei, gesendet habe ich dafür 0017000D6F0000AF2564005a03.

So habe ich die Debug-Zeile (für Circle 0990865) heute Morgen ausgewertet:

Switch 0017 000D6F000 0990865 00

000A b43c
000000C400C1 56C6
0011 00C4 000D6F000 076C535 0101B40D6F000 0990865 5DB4FF 6E8B
0017 000D6F000 0990865 00 6757
000000C500C1 FC97
000000C500DE 000D6F000 0990865 A273

Was kommt den bei 0017 zurück? Das habe ich in „Plugwise unleashed“ nicht gefunden. Müßte es nicht etwas mit 0018 sein?

Schon mal vielen Dank für Eure Unterstützung.

Viele Grüße aus dem Unterallgäu
Harry

Hallo Harry,

0017 sollte schalten laut Beschreibung.

Ab "Die Circle schalten geht auch mit "

ab „Plugwise data packet“
Plugwise protocol unleashed part 1: introduction | Maartendamen’s blog

und noch einer
Ab „Switch circles …“

0018 zeigt am Circle+ angeschlossene Circles.

Gruß
Bruno

Hallo Bruno,

vielen Dank für die schnelle Antwort und für die Links. Die Theorie hatte ich bereits durchgelesen und die Antworten im Debug-Fenster scheinen ja auch richtig zu sein.

Aber: der Plugwise schaltet nicht!

Den 0018 000D6F000 0990865 00 hatte ich noch nicht versucht, er bringt mir folgendes im Debug-Fenster:

000A b43c
0000 0180 00C1 E19F
0011 0180 000D6F000 076C535 0101 B40D6F000 0990865 5DB4 FF 6C6B
0018 000D6F000 0990865 00 cd76
0000 0181 00C14BCE
0019 0181 000D6F000 0990865 000D6F000 07369E8 00 D4D8

Bei 0018 000D6F000 0990865 01 kommt der nächste Circle (ID 01):

000A b43c
0000 0188 00C1E3B2
0011 0188 000D6F000 076C535 0101 B40D6F000 0990865 5DB4 FF 0858
0018 000D6F000 0990865 01 dd57
0000 0189 00C1 49E3
0019 0189 000D6F000 0990865 000D6F000 0996798 01 6282

Bei 0018 000D6F000 0990865 02 der dritte Circle mit der ID 02:

000A b43c
0000 0190 00C1 A43F
0011 0190 000D6F000 076C535 0101 B40D6F000 0990865 5DB4 FF 2B87
0018 000D6F000 0990865 02 ed34
0000 0191 00C10E6E
0019 0191 000D6F000 0990865 000D6F000 0B1DB2D 02 C41E

Ich denke ich habe das Protokoll in etwa verstanden, nur Schalten will das Teil nicht.:confused: Ich denke ich controlliere nun nochmals die CRC-Geschichte, allerdings dürfte er bei einem Fehler dort ja gar keine plausiblen Hex-Werte liefern?

Viele Grüße aus dem Unterallgäu
Harry