SensorAndSwitch Haus-Automation auf Webserver-Basis

Ich habe in "psgFritz!Box CPU.php" die Zeile
Code:
    $gerarray=getGerInfo(substr(basename(__FILE__,".php"),3));
vergessen. Ist oben in meinem Post vom Script korrigiert. Sorry.
 
Hat sich schon mal jemand mit dem comet Thermostat auseinander gesetzt. Wird angezeigt, auch die Temperatur, jetzt bräuchte man ja eigentlih nur noch ein + und + um die temp rauf und runter zu stellen.
 

Anhänge

  • Unbenannt.PNG
    Unbenannt.PNG
    43.6 KB · Aufrufe: 29
Hat sich schon mal jemand mit dem comet Thermostat auseinander gesetzt. Wird angezeigt, auch die Temperatur, jetzt bräuchte man ja eigentlih nur noch ein + und + um die temp rauf und runter zu stellen.
Es gibt ein neues Erkennungsbit für diese Thermostate. Leider besitze ich keins und könnte so nur auf "gut Glück" was basteln. Statt dem Ein-/Ausschalter einen +/- Schalter wäre eine Idee, oder lässt sich das auch ein-/ausschalten? Dann wäre der +/- Schalter zusätzlich.

Kann mich aber erst dranmachen, wenn ich wieder an SAS weiterbasteln kann. Ich schau im Augenblick immer nur sporadisch hier rein.
 
Hallo JL3,

Danke jetzt läuft das geänderte Script "psgFritz!Box CPU.php",
aus Post #1699 schon mehrere Stunden auf dem PI und die Daten
werden angezeigt.

Gruss ElefantenMaus
 
@ alle;

Hier mal eine Frage an alle die das Script "psgWetter.php" benutzen.

Seit 2 Tagen funtioniert bei meinen RaspiPIs das Script nicht mehr.

Auch ein Zurückspielen eines alten Images (1 Woche alt) bringt
keine Daten mehr zur Anzeige im PI.

Kann das von anderen mal überprüft werden ob das Script
noch funktioniert.

Wegen eines Problems mit dem Router musste ich in der Nacht
vom 9. auf den 10. Oktober den PI herunterfahren und
nach 10 Minuten wieder starten.

Seitdem habe ich keine Funktion des Scripts mehr.

Danke im Voraus

Gruss ElefantenMaus
 
Hallo,
mein Wetter zeigt auch nichts mehr an!
SAS läuft schon einige Monate ohne Änderung, war allerdings vor 14 Tagen mal ein Stromausfall.
Danach waren einige Schalter etwas durcheinander, aber durch einige Male von Hand schalten lief das wieder.
Wetteranzeige ist mir aber bisher nichts aufgefallen.
 
Vielleicht ist etwas mit der Abfrage der Homepage verändert wurden, weil es seit 10.10 nicht mehr funktioniert.
Mein Raspi hat ja seit 0 Uhr am 10.10 ja keine Daten mehr bekommen.
Meine Vermutung

Gibt es den noch andere Homepage von denen man solche Wetterdaten verwenden kann zum testen ?

Edit: Kann es sein das für den Zugriff auf die Daten ein API Key ( Registrierung ) benötigt wird um die Wetterdaten zubekommen.
 
Zuletzt bearbeitet:
@ alle;

Da mir die Sache mit dem Script "psgWetter.php" keine Ruhe
gelassen hat, habe ich es abgeändert und eine weitere Zeile
eingefügt.

In Zeile 26 kann nun der APPID Key eintragen werden den man
nach einer kostenlosen Registrierung auf der "Wetter-Homepage" erhält.

Hier mal das neue Script "psgWetter fuer Key.php"

PHP:
<?php

	/*
		+---------------------------------------------------------------------+
		|                                                                     |
		|   SensorAndSwitch                                      PSG-Script   |
		|   ===============================================================   |
		|   Wetter                                               Web (curl)   |
		|   ---------------------------------------------------------------   |
		|   openweathermap.org                                                |
		|   Informationen von obiger Homepage für den Ort, der anhand der     |
		|   in den Einstellungen eingelesenen Längen- und Breitengraden       |
		|   ermittelt wurde.                                                  |
		|                                                                     |
		|   (C)2014/15 BlueDragon                                             |
		|                                                                     |
		+---------------------------------------------------------------------+
	*/

	include __DIR__."/../include/psg.php";
	$gerarray=getGerInfo(substr(basename(__FILE__,".php"),3));

	if ($gerarray["Counter"]>=9) {
		$ver="V#V 4.87#";
		$zeit=date("H:i");
		$wetterkey="hier hinein den APPID-Key schreiben mit An- und Ausführungszeichen";
		$url="http://api.openweathermap.org/data/2.5/weather?lat=".BREITENGRAD."&lon=".LAENGENGRAD."&APPID=".$wetterkey."&mode=xml&units=metric&lang=de";
		$Status=web($url,$post);
		if ($Status) {
			$Cont=simplexml_load_string($Status);
			$Temp=number_format(sprintf('%.1f',$Cont->temperature->attributes()->value),1,",",".");
			$Wind=$Cont->wind->speed->attributes()->name;
			$WGeschwindigkeit=number_format(sprintf('%.2f',$Cont->wind->speed->attributes()->value*6),0,",",".");
			$WRichtung=$Cont->wind->direction->attributes()->code;
			$Luftdruck=number_format(sprintf('%.0f',$Cont->pressure->attributes()->value),0,",",".");
			$Feuchtigkeit=number_format(sprintf('%.0f',$Cont->humidity->attributes()->value),0,",",".");
			$Stadt=$Cont->city->attributes()->name;
			$Symbol='<img src="http://openweathermap.org/img/w/'.$Cont->weather->attributes()->icon.'.png" width="50" height="50">';
			$Wetter=$Cont->weather->attributes()->value;
			$temp=sprintf('%.1f',$Cont->temperature->attributes()->value);
			$feucht=sprintf('%.0f',$Cont->humidity->attributes()->value);
			$luftd=sprintf('%.0f',$Cont->pressure->attributes()->value);
			$zeitl=$gerarray["zeitl"];
			$zeith=date("G")*1;
			$tempz=unserialize($gerarray["tempz"]);
			$feuchtz=unserialize($gerarray["feuchtz"]);
			$luftdz=unserialize($gerarray["luftdz"]);
			if ($zeith!=$zeitl) {
				$tempz[$zeith]=array();
				$feuchtz[$zeith]=array();
				$luftdz[$zeith]=array();
				$zeitl=$zeith;
			}
			if ($zeitl>23) {$zeitl=0;}
			if ($temp<$tempz[$zeith]["min"] or !isset($tempz[$zeith]["min"])) {
				$tempz[$zeith]["min"]=$temp;
			}
			if ($temp>$tempz[$zeith]["max"] or !isset($tempz[$zeith]["max"])) {
				$tempz[$zeith]["max"]=$temp;
			}
			if ($feucht<$feuchtz[$zeith]["min"] or !isset($feuchtz[$zeith]["min"])) {
				$feuchtz[$zeith]["min"]=$feucht;
			}
			if ($feucht>$feuchtz[$zeith]["max"] or !isset($feuchtz[$zeith]["max"])) {
				$feuchtz[$zeith]["max"]=$feucht;
			}
			if ($luftd<$luftdz[$zeith]["min"] or !isset($luftdz[$zeith]["min"])) {
				$luftdz[$zeith]["min"]=$luftd;
			}
			if ($luftd>$luftdz[$zeith]["max"] or !isset($luftdz[$zeith]["max"])) {
				$luftdz[$zeith]["max"]=$luftd;
			}
			$echo="T#".sprintf('%.2f',$Cont->temperature->attributes()->value)."#P#".'<div style="font-size:12px;text-align:right;width:60px;position:absolute;top:-12px;">'.$Luftdruck.' hPa</div><div style="font-size:12px;text-align:left;width:60px;position:absolute;top:14px;"><img src="'.picdesign("wind.png").'" border="0" height="24"></div><div style="font-size:12px;text-align:right;width:60px;position:absolute;top:12px;">'.$WRichtung.'</div><div style="font-size:12px;text-align:right;width:60px;position:absolute;top:26px;">'.$WGeschwindigkeit.' km/h</div><div style="font-size:14px;text-align:right;width:310px;position:absolute;top:-20px;">'.$Symbol.'</div><div style="font-size:14px;text-align:right;width:310px;position:absolute;top:25px;left:0px;">'.$Wetter.'</div><div style="font-size:14px;text-align:left;width:30px;position:absolute;top:-20px;left:70px;"><img class="block" src="'.picdesign("temp.png").'" border="0"></div><div style="font-size:14px;text-align:right;width:100px;position:absolute;top:-12px;left:70px;"><img src="'.picdesign("feucht.png").'" border="0" height="12"> '.$Feuchtigkeit."%%".'</div><div style="font-size:22px;text-align:right;width:100px;position:absolute;top:2px;left:70px;">'.$Temp."°C".'</div>'."*HTML#V#".$Wetter."*ANZWETTER##V#".$Feuchtigkeit."*ANZFEUCHT#V#".$Symbol."*ANZSYMBOL#V#".$WRichtung."*ANZWRICHTUNG#V#".$WGeschwindigkeit."*ANZWGESCHWINDIGKEIT#V#".$Luftdruck."*ANZLUFTDRUCK#V#".$zeit."*Mode#V#".serialize($tempz)."*tempz#V#".serialize($feuchtz)."*feuchtz#V#".serialize($luftdz)."*luftdz#V#".$zeith."*zeith#V#".$zeitl."*zeitl#V#".$zeit."*ANZZEITUPDATE#".$ver;
		}
		else {
			$echo=$ver."C##";
		}
	}
	else {
		$echo=$ver."C##";
	}
	echo $echo;
	exit;

?>

Den Namen muss bitte jeder seiner Raspi Umgebung anpassen.

Gruss ElefantenMaus
 
Zuletzt bearbeitet:
@ElefantenMaus: vielen Dank, klappt auf Anhieb ...
 
@ElefantenMaus: Vielen Dank für das Abändern des Wetter-PSGs. Ja, die "Quelle" hat plötzlich einen Key eingeführt, sodass eine normale Abfrage nur einen Sperrhinweis bringt. Der Zyklus mit dem kostenlosen Key ist für das psg erfreulicherweise mehr als ausreichend. ;)
 
Habe mal die entscheidenden Teile aus meinem Skript rauskopiert, die für das Einstellen der CometDECT verantwortlich sind. Ist nicht vollständig und müsstefür SAS sicher noch angepasst werden. Aber vielleicht könnt Ihr ja was damit anfangen. Ich stelle die neue Temperatuir mit Javascript ein (am Ende des Codes) und rufe dann das PHP-Skript mit der neuen Temperatur als z.B. "?ain=092531234567&task=20" nochmal auf. Der stellt das dann um. (Wird immer mal 2 genommen, weil das CometDect pro 1 Grad °C zwei Schritte hat).

Code:
<?php
define('CMD',"http://fritz.box/webservices/homeautoswitch.lua'?sid=".SID."&amp;switchcmd=");
define('TSK',$_GET['task']);
define('AIN',$_GET['ain']);

if (is_numeric(TSK)) {  //Neue Temperatur ist eine ZAHL
  $rsp = file_get_contents(CMD.'sethkrtsoll&amp;param='.(TSK*2).'&amp;ain='.AIN);
} else {
	switch (TSK) {  //AN/AUS für FritzDECT
	  case 'AN':
	    $rsp = file_get_contents(CMD.'setswitchon&amp;ain='.AIN); break;
	  default:
	    $rsp = file_get_contents(CMD.'setswitchoff&amp;ain='.AIN);
	}
}

$i = 1;
$dect = simplexml_load_string(file_get_contents(CMD."getdevicelistinfos"));
foreach ($dect->device as $dev) {
	$n = $dev->name;
	$m = $dev['functionbitmask'];                                    //CometDECT hat hier  320er Maske - statt 896 bei FritzDECT200
  	$act = str_replace(' ','',$dev->attributes()->identifier);  //Wirft evtl. Leerzeichen aus der AIN raus
	if ($m == 320) {
	        $t = ($dev->hkr->tist)/2;  //IST-Temp auslesen
                $s = ($dev->hkr->tsoll)/2; //SOLL-Temp auslesen
	        $a = ($dev->hkr->absenk)/2;
		$k = ($dev->hkr->komfort)/2;
		$cmd = "'".$act."',".$i;
		$html .= '<td align="center" valign="top"><input type="button" value="'.$n.'" style="border-width:0;"></td>';
		$html .= '<td nowrap>';
		$html .= '<input type="button" value="&ndash;" onClick="downClick('.$s.','.$i.');">';
		$html .= '<input type="button" value="'.$s.'&deg;" id="click'.$i.'" onClick="chgTemp('.$cmd.');">';
		$html .= '<input type="button" value="+" onClick="upClick('.$s.','.$i.');"></td>';
		$html .= '<td align="center" nowrap>'.sprintf('%.1f',$t).'&deg;</td><td class="klein">'.$a.'&perp;'.$k.'&deg;</td></tr>';
	}
	$i += 1;
}
?>
<!DOCTYPE html>
<html><head></head>
<body>
<table border="0" cellspacing="3" style="max-width:430px;">
<tr><th colspan="5" align="center">FritzBox SmartHome</th></tr>
<tr align="center">
	<td width="35%">Ger&auml;te</td>
	<td width="25%">Bereich</td>
	<td width="20%">Ist</td>
	<td width="17%">Soll</td>
</tr>
<tr><td colspan="5"><hr></td></tr>

<?php echo $html;?>

<tr><td colspan="5"><hr></td></tr>
</table>
</body>

<script type="text/javascript">
temp = 18;
grau = '#707070';

function chgTemp(akt,zahl) {
  var item = document.getElementById("click"+zahl);
  var soll = parseFloat(item.value.replace(/[^-.0-9]/g,''));
  item.style.color = 'blue';
  window.location.href = '?ain='+akt+'&task='+soll;
}

function upClick(old,zahl) {
  var item = document.getElementById("click"+zahl);
  var temp = parseFloat(item.value.replace(/[^-.0-9]/g,''));  //um das °-Zeichen auszufiltern
  temp += 0.5;
  if (temp > 28) temp = 28;
  if (temp == old) {
  	item.style.color = grau;
	item.style.fontWeight = 'normal';
  } else {
  	item.style.color = 'blue';
	item.style.fontWeight = 'bold';
  }
  item.value = temp;
  item.style.fontWeight = 'bold';
}

function downClick(old,zahl) {
  var item = document.getElementById("click"+zahl);
  var temp = parseFloat(item.value.replace(/[^-.0-9]/g,''));
  temp -= 0.5;
  if (temp < 10) temp = 10;
  if (temp == old) {
  	item.style.color = grau;
	item.style.fontWeight = 'normal';
  } else {
  	item.style.color = 'blue';
	item.style.fontWeight = 'bold';
  }
  item.value = temp;
  item.style.fontWeight = 'bold';
}
</script>
</html>

Das sieht bei mr dann ungefähr so aus:
Bild1.jpg

Mit +/- stellt man ein. Wenn man dann in der Mitte auf die neue Temperatur klickt (die dann in Blau und fett kommt), wird's umgestellt.
Grüße robw
 
@robw: Durch sethkrtsoll&param=nnn wird wohl die neue Temperatur gesetzt. Da muss ich doch nochmal nachfragen, welche dies ist. Die Solltemperatur von Absenk oder Komfort? Irgendwie ist mir das noch unklar...

@alle: Den neuen Gerätetyp habe ich inzwischen in SAS eingebaut, sodass die Werte in der Datenbank abgelegt werden. Nur Slot-Anzeige und Steuern muss ich noch umsetzen. Kann noch etwas dauern, da ich noch nicht an der Sache dranbleiben kann.
 
Zuletzt bearbeitet:
@ JL3: Mit 'sethkrtsoll&param=nnn' stellt man die gewünschte Temperatur am Thermostat ein. Kann irgendeine beliebige sein und ist insofern nicht an die eingestellten Absenk- oder Komforttemparaturen gebunden. Man kann da also z.B. auch 28°C einstellen (mit dem Übergabewert 56). Die gilt, bis der nächste Schaltpunkt aus der Fritzbox erreicht ist.

O-Ton AVM: "HKR Solltemperatur einstellen. Mit dem „param“ Get-Parameter wird die Solltemperatur übergeben. Temperatur-Wert in 0,5 °C, Wertebereich: 16 – 56 (8 bis 28°C), 16 <= 8°C, 17 = 8,5°C...... 56 >= 28°C, 254 = ON , 253 = OFF"

Viele Grüße robw
 
Zuletzt bearbeitet:
@robw: Ich verstehe, die Komfort- und Absenktemperatur sind demzufolge nicht über diesen Weg einstellbar und nur Anzeigewerte. Vielen Dank für die Info. :)
 
@JL3: soweit ich das sehe aus der letzten Doku (AHA-HTTP-Interface_108.pdf 03.06.2015) von AVM ist ein Einstellen des Regelbereichs (Komfort/Absenk) nicht vorgesehen. Da gibts nur "GET"-Kommandos. Das einzige "SET"-Kommando für die Thermostate ist das besprochene. Schade eigentlich...

Viele Grüße robw
 
Es gibt beim Thermostat im Augenblick ein paar Probleme bei der Umsetzung der Schaltfunktion an/aus, da diese anders funktioniert als bei den normalen Schaltgeräten. Da muss mir noch eine gute Idee kommen, das intern vernünftig einzubauen. Auch die Regelung +/- benötigt neue Buttons und eine angepasste Slotdarstellung, sodass bestehende interne Darstellungen nicht damit kollidieren. Ist noch in Arbeit und dauert noch, da ich nach wie vor nur sporadisch dazu komme.

Ein anderes Problem ist zur Zeit das Wettermodul. Die Webseite hat oft den Bild-Server down und dann hängt das psg beim Laden des Wetter-Icons und bricht ab. Auch hier bin ich am Experimentieren. ;)
 
Na ja, das wird hoffentlich noch ... Und eine einfach zeile die schon mal die Temperatur anzeigt? Ginge da was für die Übergangszeit?
 
@HarryHase: Das Gerät wird ja erkannt, denke ich. Oder interpretiere ich deinen Post #1702 falsch? Oder meinst du die gewählte Temperatur, die erreicht werden soll oder das Wettermodul?

Das Problem ist im Augenblick die saubere Integration der Thermostate, da sie eine neue Gruppe darstellen und AVM hier ein paar Brüche zu den vorangegangenen in der Bedienung und der internen Struktur hat. Ein/Aus entspricht nicht dem Standard, der mit den anderen Geräten etabliert war. Gerade bei so fundamentalen Dingen merkt man, wie komplex der AVM-Baustein in SAS geworden ist.

Außerdem muss ich zugeben, dass wenn ich mal dazu komme, ich an meinem Hausautomationssystem SASKIA bastle, da es da auch noch einige Baustellen gibt.

Dies bereitzustellen wird allerdings sehr schierig werden, da es hier auf Hard- und Software ankommt. Allein bei der TFT-Display-Installation ist für jeden Displaytyp (Hersteller) eine andere Vorgehensweise angesagt. Gleiches gilt für die externe USB-Soundkarte. Die interne Sound-Erzeugung kann man vergessen, da der Soundchip der Himbeere keinen DAC hat und somit der Prozessor den Job übernimmt. Je nach Auslastung ist dann die Sprachausgabe abgehackt und ständig mit Unterbrechungen gespickt. Eine USB-Soundkarte hat einen eigenen Chip und da geht es.

Was mit meiner Alpha-Version 5 bei mir bereits funktioniert sind folgende Features:
  • alle SAS-Funktionen der Version 4
  • Sprachausgabe Zeit
  • Sprachausgabe Wetter
  • Sprachausgabe Warnfunktion Unwetter, sobald der DWD eine Meldung herausgibt, wird diese vorgelesen
  • Sprachausgabe Mitteilung über neue Mails bei Eintreffen
  • Vorlesen neuer Mails
  • Sprachausgabe Mitteilung über neue Anrufe auf dem AB
  • TFT-Displayanzeige Wetter / Temperatur / Hinweissysmbole zu AB / Mail
  • Spachausgabe zu besonderen Ereignissen (Überhitzung Himbeere, zu warm oder zu kalt im Raum, etc.)
  • Interaktion über Symbole auf dem TFT per Touch oder mit USB-Maus

Meine letzte Erweiterung ist ein digitaler Temperatursensor (Stecknadelkopfgroß), der auf eine kleine Micro-Platine gesteckt wird und diese dann per USB an der Himbeere hängt. Mittels Python und einigen Softwareinstallationen zum RAW-Auslesen von USB-Ports, hat man nun die Raumtemperatur gleich in digitaler Form. Das Python-Script dazu musste ich allerdings erst noch schreiben und auch die 64 Daten-Byte, die vom USB-Port kommen, richtig interpretieren.

Lange Rede, kurzer Sinn: Auch wenn es momentan keine neue Beta- oder Final-Version gibt, bastle ich nach wie vor daran. Allerdings ist es zur Zeit mit herabgesetzter Geschwindigkeit. Außerdem grüble ich darüber nach, wie ich das jemals alles in ein HowTo packen kann, sodass man es gut und verständlich nachvollziehen kann.

Fazit: Es wird was Neues geben, die Frage ist nur, wann ich damit soweit sein werde. ;)
 
Zuletzt bearbeitet:
Alles gut, auch mir ist die Zeit irgendwie weggelaufen, pure Anzeige klappt, reicht erst mal ....
 
Hinweis für Raspberry Pi - Upgrade:

Nach einem apt-get update, apt-get upgrade und apt-get dist-upgrade ändert sich die Anzeige des df.

In psgHimbeere.php oder psgPi.php muss nun die Zeile

PHP:
		$befehl='sudo df | grep "rootfs"';
in
PHP:
		$befehl='sudo df | grep "/dev/root"';
geändert werden, damit wieder "Disk used:" mit einem korrekten %-Wert angezeigt wird.
 
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.