Plugwise ohne Server direkt auslesen/schalten

Hi Axel

Hilfsvariablen:
Kommt darauf an wieviel ich in Fehlertorleranz investiere.

Als Alt-User hab ich ein „Unlimited“ von daher sehe ich -für mich- die Variablenanzahl eher relaxed. :smiley:

evtl. wärs hübsch alle sekundären Variablen zb. die Kalibrierdaten usw. nochmals eine ebene Tiefer zu legen. Zugriff darauf wird halt nochmals komplizierter.
Mit dem dynamisch im Code nach irgendwelchen Variable und Object ID suchen hab ichs eh nicht so… meine privaten Scripte sind die ID mehr hardgecodet…

gruß
bb

Hi Bernhard,

dann schick mir doch mal dein Entwurf, ich versuche das dann in dynamischen Code umzuwandeln.

Danke & Gruß, Axel

Soderla,
meine Inputs sind drin.

Funktion ist so wie ichs zwei Posts weiter oben beschrieben habe.
Meine Teile hab ich zwischen //BB: Begin - //BB:End tags gesetzt.

Wichtig: der Script Timer sollte nicht um 00:00:00 sonderen ein paar Sekunden danach starten also zb: Begin 00:00:15 gesetzt haben.
Ich denke das ist notwendig um evtl. Abweichungen der Circle-Zeit von der IPS-Zeit aufzufangen. Keine Ahnung wie genau die Circle Uhr im Langzeitverhalten ist. evtl. sollte man die regelmäßig nachstellen.

Vorschlag für Recover wenn 1 Circle mal nicht erreichbar war ist auch drin, aber nicht getestet.
Da immer die Werte vom Circle genommen werden sollte es eigentlich sehr robust sein und immer mit den Daten von Sense übereinstimmen.

Ich hoffe mal es funktioniert so wie geplant, Langzeittest konnte ich aus verständlichen Gründen noch nicht machen.

Was bei einem komplett jungfäulichen Circle (also einer der noch keine History im Buffer hat, passiert weiß ich leider auch nicht. evtl. muß man den nach einer Stunde Laufzeit löschen und weider neu anlegen.

Wäre nett wenn du es mal ausprobieren könntest, aber wie gesagt VORSICHT ! Der Code wurde erst vor einer Stunde fertig. Nicht das du dir irgendwelchen wichtigen Daten zersägst…

gruß
bb

<?

/*
Plugwise Skript Version 0.5
Von: Axel Philippsn
Datum: 22.04.2012
Basiert auf der Vorarbeit von
1) Maarten Damen (http://www.maartendamen.com/wp-content/uploads/downloads/2010/08/Plugwise-unleashed-0.1.pdf) und
2) Jannis (http://www.ip-symcon.de/forum/f53/plugwise-ohne-server-direkt-auslesen-schalten-17348/)
3) Brownsons IPSInstaller (http://www.ip-symcon.de/forum/f74/ipsinstaller-einige-hilfreiche-scripts-autom-installation-13228/)
*/

/*
Noch zu lösende Probleme der Plugwise-Skripte:
- Befehl 0018 meldet mir immer nur genau 11 Circles - ich habe aber 18. In Zeile 104 habe ich die Abfrage auf 20 begrenzt, sollte 100 sein. Wie sieht das bei euch aus?
- Anlegen des Netzwerks immer noch mit der 'Source' (hab keine Zeit zum testen)
- Einbindung in IPSLibrary
*/

/* Some patches by BB to read energy consumption direct from Circle Buffer    !!! Highly Experimental, use at your own risk !!!  
*/


include("PW_Include.ips.php");
include("IPSInstaller.ips.php");

$idCatCircles = CreateCategory("Circles",IPS_GetParent($IPS_SELF),0);

Switch ($_IPS['SENDER'])
	{
	Default:
	   // PRINT "PW: ".$_IPS['SENDER'];
	   break;

	Case "RunScript":
	Case "Execute":
	Case "TimerEvent":

		// Alle Circles durchlaufen, Status und Verbrauch lesen
		foreach(IPS_GetChildrenIDs($idCatCircles) as $item){   // alle Unterobjekte durchlaufen
		    $id_info = IPS_GetObject($item);
		    PW_SendCommand("0012".$id_info['ObjectIdent']);
		    PW_SendCommand("0023".$id_info['ObjectIdent']);


// BB: begin
// ask for Circle energy buffer only within first 3minutes to reduce trafic
			if (date("i", time()) < 03) {
				$logvar = GetValueString(IPS_GetVariableIDByName("LogAddress", $id_info['ObjectID']));
   	    	PW_SendCommand("0048".$id_info['ObjectIdent'].$logvar);
   		}
		}

// BB: End

		break;

	Case "Variable":
		// PRINT "PW Variable: ".$_IPS['VARIABLE'].", Value: ".$_IPS['VALUE'];
		// break;
	Case "WebFront": 	   // Zum schalten im Webfront
		// PRINT "PW Schalten: ".$_IPS['VARIABLE'].", Value: ".$_IPS['VALUE'];
	   $id = IPS_GetParent($_IPS['VARIABLE']);
		$id_info = IPS_GetObject($id);
		if ($_IPS['VALUE'] == 1) {$action = 1;} else {$action = 0;}
		$cmd = "0017".$id_info['ObjectIdent']."0".$action;
	   PW_SendCommand($cmd);

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

		break;

	Case "RegisterVariable": //
		$buf = $IPS_VALUE;
		switch ((substr($buf,0,4)))
			{
			case "0000":         //Befehl vom Stick empfangen
				switch ((substr($buf,8,4)))
				{
					case "00C1":  //Schauen ob alles empfangen wurde
		 				// print "Befehl von Stick empfangen";
						break;

					case "00D8":  //eingeschaltet
		 				// print "Eingeschaltet MAC".substr($buf,12,16);
						$myCat = IPS_GetObjectIDByIdent(substr($buf,12,16), $idCatCircles);
						SetValue(IPS_GetVariableIDByName ("State", $myCat),True);

						// Sofort Verbrauch abfragen
						// PW_SendCommand(substr($buf,12,16));

						break;

					case "00DE":  //ausgeschaltet
						// print "Ausgeschaltet MAC".substr($buf,12,16);
						$myCat = IPS_GetObjectIDByIdent(substr($buf,12,16), $idCatCircles);
						SetValue(IPS_GetVariableIDByName ("State", $myCat),False);

						// Sofort Verbrauch abfragen
						// PW_SendCommand(substr($buf,12,16));

						break;

					case "00E1":
						print "Achtung: ein Circle ist nicht erreichbar: ".$buf;
						break;

					case "00D7": // Antwort auf 003E - Bestätigung für Uhrzeit stellen
					   $mac = substr($buf,12,16);
						$myCat = IPS_GetObjectIDByIdent($mac, $idCatCircles);
					   // print "Uhrzeit gestellt auf ".substr($buf,12,16);
					   print "Uhrzeit gestellt auf  ".IPS_GetName($myCat);
						break;

					case "00DD":  // Antwort auf 0008 - Anfrage nach Circle+
					   $macplus = substr($buf,12,16);

						// Dummy Instanz für Circle+ anlegen
						$myCat = @IPS_GetObjectIDByIdent($macplus, $idCatCircles);
						if ($myCat == false) createCircle($macplus, $idCatCircles);

					   PRINT "PW MC+:".$macplus.", Now searching for Circles...";
						for ($i = 1; $i < 20; $i++) {
						   PW_SendCommand("0018".$macplus.str_pad($i, 2 ,'0', STR_PAD_LEFT));
						}
						break;

					default:
						print "Fehler von Stick: ".$buf;  //bei allem anderen
						break;
				}
				break;

			case "0011":  // Init
				// print "Die Sequenznr: ".substr($buf,4,4)."
";
				// print "MC Adresse: ".substr($buf,8,16);
				// MC Adresse: 000D6F0000C3CA8E
				// Stick: C3CE5C

				// Kalibrierungsdaten aller Circles abrufen
				foreach(IPS_GetChildrenIDs($idCatCircles) as $item){   // alle Unterobjekte
				    $id_info = IPS_GetObject($item);
				    PW_SendCommand("0026".$id_info['ObjectIdent']);
				}

				break;

			case "0013":   // Aktueller Verbrauch
			   $mcID = substr($buf,8,16);
				$myCat = IPS_GetObjectIDByIdent($mcID, $idCatCircles);
				// $pulse 	= substr($buf,28,4);
				$pulse = substr($buf,28,4);

				If ($pulse == "FFFF") {
				   // Circle ausgeschaltet, meldet FFFF
					SetValue(CreateVariable("Watt", 2, $myCat, 0, "~Watt.3680", 0), 0);
				} else {

					// print IPS_GetName ($myCat)."
";
					// 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)."
";

					$gainA	= GetValueFloat(IPS_GetVariableIDByName("gaina", $myCat));
					$gainB	= GetValueFloat(IPS_GetVariableIDByName("gainb", $myCat));
					$offTotal	= GetValueFloat(IPS_GetVariableIDByName("offTotal", $myCat));
					$offNoise	= GetValueFloat(IPS_GetVariableIDByName("offNoise", $myCat));

					// Aktueller Verbrauch in Watt ermitteln
					$value 	= hexdec($pulse)/8; ///8;
					$out 		= (pow(($value+$offNoise),2)*$gainB)+(($value+$offNoise)*$gainA)+$offTotal;
					$watt 	= (($out ) / 468.9385193)*1000;
					$watt 	= round($watt,0);

					SetValueFloat(CreateVariable("Watt", 2, $myCat, 0, "~Watt.3680", 0), $watt);

// BB: Total energy consumption kWh within actual hour

               $Pulses	= hexdec(substr($buf,32,8));  //Pulse in aktueller Stunde
               $Pulses = $Pulses /3600;
					$timestamp = time();
					$sek_akthour = (60*(date("i", $timestamp))+date("s", $timestamp));  //Sekunden in aktueller Stunde

         //    $temp = 3600* (((pow($Pulses + $offNoise, 2.0) * $gainB) + (($Pulses + $offNoise) * $gainA)) + $offTotal);
			//		$result = ($temp / $sek_akthour) / 468.9385193;
         //    $result = (($result / 3600)* $sek_akthour);

				   $temp = ((pow($Pulses + $offNoise, 2.0) * $gainB) + (($Pulses + $offNoise) * $gainA)) + $offTotal;
					$result = (($temp / $sek_akthour) / 468.9385193)*$sek_akthour;

               SetValueFloat(CreateVariable("Summe_akt_Stunde", 2, $myCat, 0, "~Electricity", 0),$result );
               
        // add to cumulated energy consumtion
		        	$total_consumption = $result + GetValueFloat(IPS_GetVariableIDByName("Gesamtverbrauch_log", $myCat));
		      	SetValueFloat(CreateVariable("Gesamtverbrauch",2,$myCat,0,""),$total_consumption);

//BB: End


/*
					// Gesamtverbrauch in kWh
					$oldPulses = GetValue(IPS_GetVariableIDByName("Pulses Stunde", $myCat));
					$newPulses	= hexdec(substr($buf,32,8));

 					// PRINT IPS_GetName($myCat)." - Pulses Neu: ".$newPulses.", Alt: ".$oldPulses."
";

					if ($newPulses > $oldPulses)
						$delta = $newPulses - $oldPulses;
					else if ($newPulses == $oldPulses)
						$delta = 0;
					else if ($newPulses < $oldPulses)
						$delta = $newPulses;

					// $a = IPS_GetVariable(IPS_GetVariableIDByName("Pulses Stunde", $myCat));
               // $seconds = time() - $a["VariableUpdated"];
					$kWh = pulsesToKwh($delta, $offNoise, $offTotal, $gainA, $gainB);

 					// PRINT IPS_GetName($myCat)." - Pulses Neu: ".$newPulses.", Alt: ".$oldPulses.", Delta: ".$delta.", kWh: ".$kWh."
";

					SetValueFloat(CreateVariable("Pulses Stunde", 2, $myCat, 0, "", 0), $newPulses);
					$oldGesamtverbrauch = GetValue(IPS_GetVariableIDByName("Gesamtverbrauch", $myCat));
               SetValueFloat(CreateVariable("Gesamtverbrauch", 2, $myCat, 0, "~Electricity", 0), $oldGesamtverbrauch + $kWh);
 					// PRINT IPS_GetName($myCat)." - Gesamtverbrauch Neu: ".$oldGesamtverbrauch + $delta.", Alt: ".$oldGesamtverbrauch.", Delta: ".$delta;
*/
				}
				break;

			case "0019":   //Adressen abfragen

				// print "Die Sequenznr: ".substr($buf,4,4)."
";
				// print "MC Circle+: ".substr($buf,8,16)."
";
			   $mac = substr($buf,24,16);
			   if (!($mac == "FFFFFFFFFFFFFFFF")) {
					$myCat = @IPS_GetObjectIDByIdent($mac, $idCatCircles);
					if ($myCat == false){
					   createCircle($mac, $idCatCircles);
					} else {
						// print "PW Node ".substr($buf,40,2).": ".IPS_GetName($myCat).", MAC:".$mac;
					}
				};
				break;

			case "0024":   //Status
			   $mcID = substr($buf,8,16);
				$myCat = IPS_GetObjectIDByIdent($mcID, $idCatCircles);
				// echo IPS_GetName ($myCat).": ".substr($buf,41,1);
				SetValue(CreateVariable("State", 0, $myCat, 0, "~Switch", $IPS_SELF), substr($buf,41,1));

		//		SetValueString(CreateVariable("LogAddress", 3, $myCat,0,""),intval((hexdec(substr($buf,32,8)) - 278528) / 32));


				$logadr=(substr($buf,32,8));  //BB: keine Ahnung ob dies immer funktioniert. 0x20 = 32 = 8*4 = letzten 4 Stunden
            $logadr = strtoupper(dechex((hexdec($logadr))-32));  //so gehts sicher, doppelte Conversion ist halt nicht schön

            $logadr = str_pad($logadr,8,'0',STR_PAD_LEFT);
            SetValueString(CreateVariable("LogAddress", 3, $myCat,0,""),$logadr);


			//	 PRINT "LogAddress ".IPS_GetName($myCat).": ".intval((hexdec(substr($buf,32,8)) - 278528) / 32);
			//	 PRINT "LogAddress ".IPS_GetName($myCat).": Hex ".substr($buf,32,8).", Dez ".((hexdec(substr($buf,32,8)) - 278528) / 32);

				// 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 "Minuten : ".substr($buf,28,4)."
";
				// PRINT "Zeit ".IPS_GetName($myCat).": ".date('c',pwtime2unixtime(substr($buf,24,8)));
				// PRINT "Zeit ".IPS_GetName($myCat)." - Hex: ".substr($buf,24,8);

				// print "log Adresse: ".substr($buf,32,8)."
";
				// 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)."
";

				break;

			case "0027":   //Kalibrierung
				$myCat = IPS_GetObjectIDByIdent(substr($buf,8,16), $idCatCircles);

				SetValueFloat(CreateVariable("gaina",2,$myCat,0,""),bintofloat(substr($buf,24,8)));
				SetValueFloat(CreateVariable("gainb",2,$myCat,0,""),bintofloat(substr($buf,32,8)));
				SetValueFloat(CreateVariable("offTotal",2,$myCat,0,""),bintofloat(substr($buf,40,8)));
				if (substr($buf,48,8)=="00000000")
					SetValueFloat(CreateVariable("offNoise",2,$myCat,0,""),0);
				else
					SetValueFloat(CreateVariable("offNoise",2,$myCat,0,""),bintofloat(substr($buf,48,8)));
				break;

			case "0049": // Antwort auf 0048 - historischen Verbrauch lesen (Buffer)
			   $mcID = substr($buf,8,16);
				$myCat = IPS_GetObjectIDByIdent($mcID, $idCatCircles);

				$gaina	= GetValueFloat(IPS_GetVariableIDByName("gaina", $myCat));
				$gainb	= GetValueFloat(IPS_GetVariableIDByName("gainb", $myCat));
				$offTotal	= GetValueFloat(IPS_GetVariableIDByName("offTotal", $myCat));
				$offNoise	= GetValueFloat(IPS_GetVariableIDByName("offNoise", $myCat));



			   // PRINT "Buffer: ".$buf."

";
				// print "Die Sequenznr: ".substr($buf,4,4)."
";
				// print "MC Adresse: ".substr($buf,8,16)."
";
	//			PRINT IPS_GetName($myCat)."
";
/*			print "Logdate 1: ".date("d.m.Y H:i", pwdatetodate(substr($buf,24,8))).": ";
				print "Pulse 1: ".pulsesToKwh(hexdec(substr($buf,32,8)), $offNoise, $offTotal, $gaina, $gainb)."
";
				// print "Pulse 1: ".substr($buf,24,8)."
";
				print "Logdate 2: ".date("d.m.Y H:i", pwdatetodate(substr($buf,40,8))).": ";
				print "Pulse 2: ".pulsesToKwh(hexdec(substr($buf,48,8)), $offNoise, $offTotal, $gaina, $gainb)."
";
				//print "Pulse 2: ".substr($buf,40,8)."
";
				print "Logdate 3: ".date("d.m.Y H:i", pwdatetodate(substr($buf,56,8))).": ";
				print "Pulse 3: ".pulsesToKwh(hexdec(substr($buf,64,8)), $offNoise, $offTotal, $gaina, $gainb)."
";
				// print "Pulse 3: ".substr($buf,56,8)."
";
				print "Logdate 4: ".date("d.m.Y H:i", pwdatetodate(substr($buf,72,8))).": ";
				print "Pulse 4: ".pulsesToKwh(hexdec(substr($buf,80,8)), $offNoise, $offTotal, $gaina, $gainb)."
";
*/				// print "Pulse 4: ".substr($buf,80,8)."
";

//BB: Begin
//Read last hour energy consumption from Circle Buffer, then add up to IPS Gesamtverbrauch

	         $var_id = IPS_GetVariable(IPS_GetVariableIDByName("Gesamtverbrauch_log", $myCat));
				$time_diff =  time() - $var_id['VariableChanged'];
				if ($time_diff >= 3600) {    // make shure only log once within each hour

				   $total_consumption = GetValueFloat(IPS_GetVariableIDByName("Gesamtverbrauch_log", $myCat));
					$lasthour = pulsesToKwh(hexdec(substr($buf,80,8)), $offNoise, $offTotal, $gaina, $gainb);
					$total_consumption = $total_consumption + $lasthour;
// log this value to Database
		      	SetValueFloat(CreateVariable("Gesamtverbrauch_log",2,$myCat,0,""),$total_consumption);
					}
			
/*  --------------
 To recover in case circle or IPS was offline during last request we can take care about last two hours
 experimental, but I think it will work:
         	if ($time_diff > 3600 *2) {    // make shure only log if last log was two ago

				   $total_consumption = GetValueFloat(IPS_GetVariableIDByName("Gesamtverbrauch_log", $myCat));
					$lasthour = pulsesToKwh(hexdec(substr($buf,80,8)), $offNoise, $offTotal, $gaina, $gainb);
					$2ndlasthour = pulsesToKwh(hexdec(substr($buf,64,8)), $offNoise, $offTotal, $gaina, $gainb);
					$total_consumption = $total_consumption + $lasthour + $2ndlasthour;
// log this value to Database
		      	SetValueFloat(CreateVariable("Gesamtverbrauch_log",2,$myCat,0,""),$total_consumption);

// add energy consumtion from actual hour to get correct value for Webfront
		      	$total_consumption = $total_consumption + GetValueFloat(IPS_GetVariableIDByName("Summe_akt_Stunde", $myCat));
		      	SetValueFloat(CreateVariable("Gesamtverbrauch",2,$myCat,0,""),$total_consumption);
		      }
		.... to be continued for 3rdlasthour, ... 4thlasthour
----------------
*/
	

//BB: end

			break;

			case "003F": // Uhrzeit auslesen
			   $mcID = substr($buf,8,16);
				$myCat = IPS_GetObjectIDByIdent($mcID, $idCatCircles);
				date_default_timezone_set('UTC');
				$myTime = mktime(hexdec(substr($buf,24,2)), hexdec(substr($buf,26,2)), hexdec(substr($buf,28,2)), 0,0,0);
				date_default_timezone_set('Europe/Berlin');
				// print "PW Uhrzeit: ".IPS_GetName($myCat).": "..":".).":".).", Tag der Woche: ".."
";
		//		print "PW Uhrzeit - ".IPS_GetName($myCat).": ".date("H:i:s", $myTime)."
";
				// 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;

			}
	break;
	}

function createCircle($mac, $parentID){
//	print "PW Create Circle: ".$mac;
	$item = CreateInstance($mac, $parentID, "{485D0419-BE97-4548-AA9C-C083EB82E61E}", $Position=0);
	$id_info = IPS_GetObject($item);
	IPS_SetIdent ($item, $mac);

	// CreateVariable ($Name, $Type, $Parent, $Position, $Profile, $Action=0, $ValueDefault='', $Icon="")

	CreateVariable("State", 0, $item, 0, "~Switch", $IPS_SELF, false);
	CreateVariable("Watt", 2, $item, 0, "~Watt.3680", 0, 0);

   $myVar = CreateVariable("Gesamtverbrauch_log",2,$item,0,"",0);
	IPS_SetHidden($myVar, True);


	CreateVariable("Gesamtverbrauch", 2, $item, 0, "~Electricity", 0, 0); //~Electricity
	$myVar = CreateVariable("Pulses Stunde", 2, $item, 0, "", 0);
	IPS_SetHidden($myVar, True);
	// $myVar = CreateVariable("LogAddress", 3, $item, 0, "", "");
	// IPS_SetHidden($myVar, True);
	$myVar = CreateVariable("gaina",2,$item,0,"",0);
	IPS_SetHidden($myVar, True);
	$myVar = CreateVariable("gainb",2,$item,0,"", 0);
	IPS_SetHidden($myVar, True);
	$myVar = CreateVariable("offTotal",2,$item,0,"",0);
	IPS_SetHidden($myVar, True);
	$myVar = CreateVariable("offNoise",2,$item,0,"",0);
	IPS_SetHidden($myVar, True);

	// Kalibrierungsdaten vom Circle abrufen
	PW_SendCommand("0026".$mac);

	// Zeit stellen
 	PW_SendCommand("0016".$mac.pwdatum());

	PW_SendCommand("0012".$mac);
	PW_SendCommand("0023".$mac);

}

?>

Hi Berhard,

sieht gut aus, werde ich heute abend versuchen zu testen.

Hier erst mal das Skript zum Stellen der Uhrzeit. Dabei ist zu beachten, dass die Circles intern in UTC rechnen.

<?
date_default_timezone_set('UTC');

include("PW_Include.ips.php");
include("IPSInstaller.ips.php");

$idCatCircles = CreateCategory("Circles",IPS_GetParent($IPS_SELF),0);

// Alle Circles durchlaufen
foreach(IPS_GetChildrenIDs($idCatCircles) as $item){   // alle Unterobjekte durchlaufen
   $id_info = IPS_GetObject($item);
 	PW_SendCommand("0016".$id_info['ObjectInfo'].pwdatum());
}
?>

Die Funktion pwdatum() befindet sich in pwinclude.ips.php.

Ich lasse das Skript nächtlich um 3:57 oder so laufen…

Danke & Gruß, Axel

Servus Axel

kleine Warnung: irgendwas stimmt mit der Verbrauchsberechnung noch nicht.
Hab mir grad mal den log meines Servers angesehen.
Das Ergebnis ist nicht plausibel. Er zieht recht konstant 80Watt, der log paßt da aber gar nicht dazu.
Heut hab ich aber keine Lust mehr den Bug zu finden, bin grad erst aus der Firma gekommen.

gruß
bb

Hallo Axel

ich glaub ich hab den Fehler gefunden.
Ähhhm, er lag nicht bei mir.

Meiner Meinung nach hat deine pulsestoKwH() Funktion ein Problem.

Es müssen erst die Pulse vor der Verrechnung der Kalibrierung durch die Zeitspanne (bei Stunde 3600) dividiert werden, und dann das Ergebnis wieder mit 3600 multipliziert.
Zugegeben die Doku vom MaartenDamen ist da auch mißverständlich.

Ich hab den meiner Meinung nach richtigen Code angehängt.

function pulsesToKwh($value, $offRuis, $offTot, $gainA, $gainB) {
		if ($value == hexdec("FFFFFFFF")) {
			return 0;
		} else {
		   $value = $value / 3600;
			$pulses = (pow(($value + $offRuis), 2) * $gainB) + (($value + $offRuis) * $gainA) + $offTot;
			$result = (($pulses / 3600) / 468.9385193)*3600;
			return $result;
		}
	}

Was ist passiert: Ich hab nur die Pulse welche aus dem Stunden-Buffer gelesen wurden mit der kaputten Funktion verrechnet. Die liefert bei einem Gerät welches eien ganze Stunde läuft und konstant ~80Watt Stromaufnahme liefert ein Ergebnis von ~0.05kWh. Nun, das kann net stimmen.

  • kannst das bitte mal bei dir querchecken ?

Alle anderen Berechnungen wurden quasi händisch mit richtigem Code gemacht.
Dadurch ergab sich dann diese merkwürdige Treppenkurve.

So, jetzt mal wieder einen Tag alle Variablen loggen und sehen und sehen obs paßt oder nochwas auftaucht.

gruß
bb

Hatte meine Verbrauchsmessung mit den Werten der Source quergetestet - sah gut aus. Hab die Thematik dahinter aber nicht verstanden…

FYI - Bin mir auch nicht sicher ob die pwdatum-Funktion stimmt.

Überhaupt komme ich mit allen Datumsfunktionen nicht zurecht. Die Circles rechnen intern mit UTC. Jetzt scheint es aber unterschiedliche UTC’s zu geben - evtl. mit und ohne Sommerzeit. Wenn man statt date() die Funktion gmdate(), die auf UTC basiert, benutzt, werden 2 Stunden Unterschied zurückgegeben. UK hat dagegen (wegen Sommerzeit?) aktuell nur eine Stunde Unterschied.

Aufgabe für uns: entweder herausfinden, ob Circles Sommerzeit beachten oder sich einfach stramm nach MEZ zu richten. Letzteres wäre einfacher im handling, aber dann stimmen sicher die Zeiten in Source nicht (welche man aber dann nur noch zur Kontrolle braucht).

Warum das ganze? Ich will den Gesamtverbrauch immer noch über den Buffer auslesen. Man braucht eigentlich nur den aktuellen Wert, der mit der aktuellen LogAdress ausgelesen werden kann…

Bin verwirrt, tendiere mihc einfach nach der Ortszeit zu richten…

Und was versprichst dir davon ? Ich mein damit machst dir doch nur unnötig das Leben schwer.
IPS läuft im Normalfall eh dauernd.

Wegen der Uhrzeit, hmm ab dem Moment wo du dem Circel die Uhrzeit setzt, und das machst du ja regelmäßig läuft der doch mit der PC Zeit.
Also wo ist das Problem ?

gruß
bb

Ach ja, meine Variante ist auch noch nicht ganz sauber.

Der erste Fix hat funktioniert, aber da ist nochwas.
Probleme sieht man halt immer erst nach Stunden im log, drum dauerts etwas.

gruß
bb

Hallo
Heute ist mein Starterpaket gekommen :smiley:
Werde die Sache dann Morgen mal Testen.

1007 - warte noch, werde am WE ein Update senden, was den Gesamtverbrauch sauber erfasst.,

Oder interessieren sich nur Wuppi, Jannis und ich für Plugwise?

Lese nach wie vor interessiert mit und bin gerne beim testen dabei…

Danke Kronos - Gesamtverbrauch macht noch kleinere Probleme, bspw. wenn LogAdress sich ändert. Das passiert halt nur alle 4 Stunden, daher dauerts…

Dazu hat das Skript jetzt den Verbrauch eines dummen Circles 3x gemeldet - warum weis ich auch noch nicht.

@BBernhard: ich hab jetzt den Ansatz verfolgt, die Uhr der Circles eine Minute vorzustellen und um x:59:30 den Gesamtverbrauch auszulesen. Damit bekomme ich mit einfachstem Aufwand sehr genaue Werte, welche in IPS auch noch der richtigen Stunde zugeordnet werden.

Besser ginge es meiner Ansicht nur noch, wenn man Werte in eine andere Datenbank schreibt. Wenn man dann noch die Sequenznummer auswertet und zuordnet dann wäre es top, ist aber sicher nur mit einem eigenem Modul möglich. Ausfall eines Circles könnte man aber einfacher über das letzte Aktualisierungsdatum ermitteln…

Hab heute mal euer Scripte getestet dabei ist mir folgendes aufgefallen.
Ich hab nur einen Circle+ und einen Circle zur Zeit.
Und dieser Circle wollte sich partout nicht melden.

PRINT "PW MC+:".$macplus.", Now searching for Circles...";
for ($i = 1; $i < 20; $i++) {
PW_SendCommand("0018".$macplus.str_pad($i, 2 ,'0', STR_PAD_LEFT)); 

Nach langem Suchen Fehler gefunden.
Die Schleife muss bei 0 beginnen. Danach hat er den Circle gefunden.

Hallo zusammen,
ich lese hier und auch in anderen PlugWise Threats schon eine ganze Weile mit. Erst mal ein Lob an alle die sich hier so intensiv mit Plugwise beschäftigen und richtig ins Detail gehen. Super!!
Habe Plugwise schon im Einsatz. Allerdings ohne Einbindung in IPS. Da ich mit USB leider nix anfangen kann (in meinem Kopf) habe ich auf den Stretch Lite Pro gewartet, der vor einer Woche eingetroffen ist.
Leider hab ich wohl die Beschreibung nicht richtig gelesen. Hab gedacht, dass durch den Stretch Lite die Source auf den Stretch Lite verlagert wird und die Circles direkt mit dem Stretch Lite kommunizieren. Dem ist leider nicht so.

Also was ist gehommen: Ein gebrandeter Linksys WRT160NL. Ohne Source-Pro Lizenz wie in der Beschreibung angekündigt, ohne jegliche Doku.

Einbinden ins IP-Netz kein Problem. Die Routerfunktionalität ist stark eingeschränkt. Der Webzuggriff mit den Anmeldedaten für Plugwise auf einem Kleber auf der Rückseite zeigt nur eine leere Seite. Die Antwort vom plugwise-Support war dann ernüchternd.

Das Ding funktioniert so:
Den Stick (mit einem kurzen USB-Verlängerungskabel (da am Router zu wenig Platz für den Stick ist)) an den Stretch Lite anschliessen und im Programmverzeichnis der Source-Software eine settings.ini mit dem Inhalt:

maxwin
comport="ssh://user:password@IP:22"

erstellen.
Dadurch greift die Software nicht mehr direkt auf den USB-Stick zu, sondern via ssh und IP.
Dadurch könnte man dann von mehreren PCs, auf denen die Software installiert ist, auf die Daten zugreifen.

Auf eine weitere Supportanfrage nach einer Doku zur SSH-Schnittstelle habe ich zur Antwort bekommen, dass das nicht ohne die Source geht.
Im 3. oder 4. Quartal (ohne Jahresangebe) soll wohl ein Gateway herauskommen.

Aber unser Gateway welcher die Steuerung des Plugwise Systems auch ohne PC ermöglichen soll wird voraussichtlich im Q3-Q4 verfügbar sein. Dieser wird dann später Software seitig noch so verändert das es auch Schnittstellen geben wird. Natürlich gibt es dafür dann auch Android und iOS Apps.

Na darauf bin ich aber mal gespannt.

Hat vielleich noch jenamd den Stretch Lite im Einsatz und eine Einbindung in IPS realisiert?

Hi 1007,

Fehler ist behoben. Sieht ganz gut aus, ich lasse das jetzt weiter durchlaufen und wenn dem morgen auch nohc so ist, dann werde ich die Skripte posten.

Zu Stretch Lite Pro kann ich nichts sagen, hier habn das - denke ich - sowieso alle mit Stick am IPS Rechner. ich erkenne auch kein Grund, warum man das nicht so machen sollte. Wenn Rechner zuweit von Circles weg ist, dann halt per Silex auf Ethernet oder so…

Danke & Gruß, Axel

Hallo,

ich habe gerade die Version 0.6 im Originalpost hochgeladen.

Funktioniert bei mir einwandfrei. Gesamtverbrauch wird jetzt stündlich über Buffer ausgelesen, ist daher so genau wie in der Source. Bitte das Timing beachten (siehe Installationsanleitung).

Danke & Gruß, Axel

Zwei Circles liefern mir dauerhaft negative Werte beim Gesamtverbrauch (Waschmaschine und Trockner). Hab das nicht nicht mit Werten der Circle verglichen. Hat das schon jemand gesehen?