Skip to content

FHEM: Heizung (und weitere Geräte) durch Anwesenheit steuern

Eine kleine Übung, die mir viel Spaß und ein wenig Kopfzerbrechen bereitet hat, war die Anwesenheitskontrolle. Was mit "define Variablenname presence lan-ping 123.123.123.123" flott niedergeschrieben ist, hat die ein oder andere Tücke. Aber dazu später mehr.

Die anfängliche Überlegung war, meine Heizung (in Ermangelung weiterer Aktoren) durch Anwesenheit zu schalten. FHEM liefert dabei eingebaut unter anderem die Anwesenheitskontrolle via ICMP. Praktisch, dachte ich mir, da sowohl ich als auch meine Frau nicht ohne Handy aus dem Hause gehen. Leider hat Apple im Iphone den kleinen Fallstrick eingebaut, dass das dumme Gerät keinen ordentlichen Schlafmodus mit reduzierter Sendeleistung hat, sondern sich einfach komplett aus dem WLAN verabschiedet, sobald das Display mal wenige Sekunden nicht aktiv ist. Mein Nexus ist da etwas weniger schwachsinnig gebaut, und reduziert einfach die Leistung.
"FHEM: Heizung (und weitere Geräte) durch Anwesenheit steuern" vollständig lesen

FHEM: Heizplan mit Feiertagen

Perl in wenigen Tagen zu lernen ist glücklicherweise keine große Herausforderung, wenn man bereits programmieren kann.

Daher habe ich mein Heizungsskript noch um eine Feiertagskontrolle erweitert. Hierzu sind noch einige Verrenkungen nötig gewesen. Ich habe mir, wie im FHEMWiki beschrieben, eine holiday-Definition in der fhem.cfg angelegt, und verwende diese nun, um zu schauen, ob der aktuelle Tag und die folgenden sechs Tage Feiertage sind.


my %dayHash = ();
for(my $i=0; $i <= 6; $i++)
{
my $dur = DateTime::Duration->new(
years => 0,
months => 0,
weeks => 0,
days => $i,
hours => 0,
minutes => 0,
seconds => 0,
nanoseconds => 0
);
my $dt = DateTime->now; # same as ( epoch => time() )
$dt = $dt->add_duration($dur);
my $month = $dt->month; # 1-12
if($month < 10){$month ="0$month";}
my $day = $dt->day; # 1-31
if($day < 10){$day ="0$day";}
my $dow = $dt->day_of_week_0; # 0-6 (Monday is 0)
my %days = (0 => "Mon",
1 => "Tue",
2 => "Wed",
3 => "Thu",
4 => "Fri",
5 => "Sat",
6 => "Sun"
);
if(fhem("get NRW_Feiertag $month-$day") eq "none")
{
$dayHash{$days{$dow}} = "false";
}
else
{
$dayHash{$days{$dow}} = "true";
}
}


Dieser Code-Schnippsel liefert mir eine Hashtable, aus der ich pro Tag den Status true/false holen kann, also beispielsweise Wed: true.

Um zu prüfen, ob mein Heizplan verändert wurde, lese ich den Timestamp, und vergleiche mit einem angelegten Dummy.

my $lastChanged = $fstat[11];
my $fhemLastChanged = Value("HeizplanLastChanged");


Schließlich werden noch die TimeSets verglichen, so dass nur die veränderten Zeilen geschickt werden.


my $currentTimeSet = ReadingsVal("HeizungWohnzimmer_235134_Clima","tempList$Day","nil");
if($TimeSet ne $currentTimeSet)
{
if($dayHash{"$Day"} eq "true")
{
{ fhem("set " . $Radiator . "_Clima tempList" . $Day . " prep 08:00 17.0 23:00 21.0 24:00 17.0")};
}
else
{
{ fhem("set " . $Radiator . "_Clima tempList" . $Day . " prep " . $TimeSet)};
}
}


Zuguterletzt wird der Dummy HeizplanLastChanged mit dem aktuellen Änderungsdatum versehen:
fhem("set HeizplanLastChanged " . $fstat[11]);

FHEM: HomeMatic-Thermostate mit Heizplan versorgen

Kurz vor Weihnachten habe ich mir ein CUL-Board für meinen Raspberry Pi gekauft, und zum Spielen noch drei Thermostate HM-CC-RT-DN von HomeMatic. Der Hersteller führt sonst eher die teuersten Produkte für den Heimautomatisierungsbereich, hat aber günstige und gute Thermostate. Meine haben eine stabile Überwurfmutter aus Metall, drei Adapter, damit sie auch auf jede Heizung passen, und generell eine gute Haptik.
"FHEM: HomeMatic-Thermostate mit Heizplan versorgen" vollständig lesen

IPv6-Umstell-o-mania

Es ist soweit. Der Internetanbieter ist gewechselt, 150mbit kommen zu über 80% an, was ich persönlich top finde. Lediglich die Umsetzung der Anbindung ist etwas dürftig: DSLite. Daher bin ich nun dazu gezwungen, meine Anwendungen und Endgeräte auf IPv6 umzustellen, was natürlich auch zu kleinen ... Herausforderungen geführt hat. Um Leidensgenossen diese unter Umständen zu ersparen, will ich hier einmal meine Gedanken niederschreiben.



Generelle IPv6-Fähigkeit: FritzBox Cable 6360 macht es möglich. IP_PD und IP_IA aktiviert, und ab gehts. Standardmäßig kommen alle Microsoft-Geräte bei mir bestens klar. Einige Linux- und BSD-Instanzen wehren sich, aber spielen nach einer schnellen Konfiguration ebenfalls mit. FreeNAS ließ sich bequem über sein Webinterface verstellen, Debian brauchte - zumindest in meiner Konfiguration - einen kleinen Wink mit dem Zaunpfahl in der /etc/network/interfaces: iface eth0 inet6 dhcp.
Im lokalen Netz sind alle Geräte relativ gut per IPv6-Adresse zugänglich. Lediglich die OwnCloud braucht ein wenig Überzeugungsarbeit. In meiner Konfiguration ist ein SSL-Virtualhost eingerichtet, der offenbar nicht korrekt auf IPv6 horcht. Das ist schnell mit Anpassungen in der ports.conf und der genutzten Site nachgezogen:
Die Zeile Listen 443 wird zu Listen *:443 in der ports.conf. Anschließend wird die Site-Konfiguration angepasst: Der Virtualhost bekommt die korrekte Benamung virtualhost *:443, wonach dann der gute Apache durchgestartet wird. Ein fixer tcpdump -i eth0 'port 443' | tee dat zeigt Action auf Port 443.



Doch dann kommt die traurige Ernüchterung: Meine öffentliche IPv6 ist aus dem Internet nicht erreichbar :-( Die Portfreigabe für IPv6, die die FritzBox anbietet, scheint nicht korrekt zu funktionieren. Zahllose versuche, irgendetwas mit Routen o.ä. zu verbessern, führt zu nichts, doch dann kommt die Erleuchtung: Um die Portfreigabe zu aktiveren, muss scheinbar PING6 aktiviert werden. Warum? Wer weiß das schon. Ist auch egal.

My first PowerShell ISE Add-In

All hail the mighty PowerShell!


There are a myriad of things you can do with the PowerShell. With it's .NET functionalities and paired with great cmdlets you do not need to develop type-safe scripts. There is virtually nothing to worry about, since all variables, if not cast into a specific type, absorb the type of the object saved to the variable. Cmdlets like Where-Object, Select-Object, Format-Table and the allmighty Get-Member make script developement fun.

"My first PowerShell ISE Add-In" vollständig lesen

Project Microserver

Es ist vollbracht, der N40L mit 8GB RAM und 12TB an Festplatten sind bestellt. Zeit, mit den ersten Überlegungen zu beginnen!



Zu Beginn erst einmal Überlegungen zum System. Meine Vorstellung sieht einen Hypervisor vor, 6T im RAID1 bereithält. Im Privatbereich hoffe ich einfach mal, dass die MTBF der gekauften Platten, der Seagate ST3000DM001, meinen Server wenigstens für zwei Jahre zuverlässig mit Platz versorgt. Und Folgendes soll darauf laufen:



  • Testnetz mit Active Directory, PKI, Exchange, ... (Größe: Höchstens 1TB)

  • Linux-System mit sabnzbd, sickbeard und couchpotato (Größe: Vernachlässigbar...)

  • Dediziertes Linux-System für NFS und SMB-Mounts so wie Medienstreaming (Größe: Rest - 2TB)


Während das Testnetz nicht sonderlich viel Speicherplatz brauchen sollte, da ja auch nur Testdaten und Maschinen dort laufen werden, sollte 1TB genügen. Die Linux-Systeme müssen hier etwas mehr Platz bereithalten, sie sollen den Datenbestand bereithalten. Gesichert wird bei Bedarf auf externe Festplatten.

Die übrigens 2TB werden für zukünftige VM-Installationen bereitgehalten, wie beispielsweise Router, Firewall, Proxy oder ähnliches.



In Sachen Hypervisor fiel meine Wahl auf proxmox VE, einer Komplettlösung aus KVM, qemu und openVZ, optisch wunderbar präsentiert in einem Webinterface. Die Ähnlichkeiten zu kommerziellen Hypervisoren sind frappierend. Installation und Einrichtung des Storage laufen zügig und problemlos, eine KVM ist schnell erstellt. Da ich noch keine Erfahrungen mit openVZ gesammelt habe, soll eine traditionelle VM erst einmal genügen.


Die längste Zeit nimmt die Migration der Physik auf den KVM-Host in Anspruch. ~500GB werden über ein 100BaseTX-Netz eben nicht so flott ausgetauscht, wie im Gigabit-LAN. RHEL stellt einen guten Guide und die Binary virt-p2v bereit, die ich allerdings unter Debian nicht auf Anhieb nutzen konnte. Der Einfachheit halber habe ich also Clonezilla im Device-to-Device-Mode verwendet. Einfacher hätte es auch wirklich nicht gehen können:

Im Wizard wird am Quellgerät schnell DHCP eingestellt, die korrekte Festplatte gewählt, und auf Anweisungen gewartet. Sobald diese erscheinen, wird die KVM mit angebundener Live-CD angeschmissen, und den Anweisungen des Quellgerätes Folge geleistet.


Nach vielen vielen Stunden des Wartens kann dann das neue alte System in Betrieb genommen werden, aber dazu in einem nächsten Post mehr.

Microsoft Server: Remotely delete certificate for users

So you want to delete a user's certificate? "But it's so cumbersome!" you say? Rubbish, I answer! It actually is pretty much a one liner, depending on your screen resolution of course... As I could not find a useful and simple script doing what I wanted on the entire internet (i.e. the first two pages of my Google results) I whipped out the old Powershell and started typing. The result may be used by you in whatever way you deem fit.
"Microsoft Server: Remotely delete certificate for users" vollständig lesen

Monitoring a DHCP-server remotely

This entry is in English, since I spent many many days on the web searching for four simple paths to put some files...


But let's just start at the beginning. Have you ever wanted to query a DHCP server for it's scopes remotely? Maybe also list all clients in each scope? Well then wait no longer, netsh to the rescue!
The network shell has many advanced features that are either built in or have to be added as a helper. With netsh you can do an awesome lot of things, including managing your DHCP server. On the server itself the DHCP-helper DHCPMon.dll is loaded by default when you start the net shell. Let's have a quick look at some sample commands:


netsh dhcp server 127.0.0.1 show scope

Yes. It is that simple. This command spits out your scopes for further analysis. Using a scopes IP-Address you can query its clients like this:

netsh dhcp server 127.0.0.1 YourScopeHere show clients 1

I have actually no clue what the argument 1 does, and I could care less, since the list is sufficiently formatted to be put through some regex-matches and replaces. This way you can e.g. save an arraylist of clients to manage their SCCM membership state or whatever rocks your boat.


But now, you can't just log on to your DHCP server and call some script all day long, especially not if the server is productive and the script is run under the administrator's account. That's just wrong. On so many levels.

My quest for managing a DHCP server remotely began because I wanted to filter my leases for specific hostnames. For obvious security reasons this had to be done impersonating a service account. If you are an administrator for a larger company this is most likely a requirement for you and your scripts as well.

The net shell actually offers the option of connecting to a DHCP server remotely like this:

netsh -r SERVERNAME -u USERNAME COMMAND

This technique sadly suffers from some limitations when trying to query a DHCP server. Be it because of a restrictive firewall policy or some other setting that causes this the remotely accessed net shell does not return any output. You are most likely not even receiving any output when you type a question mark. I have not researched this phenomenon as I already squandered countless hours on troubleshooting and wanted to get stuff done.


The solution I finally stumbled upon was actually quite simple. Install another DHCP server ;-) Stupid as it sounds, doing so at least gave me the standard paths for all files net shell needed and since I wanted to insert discovered clients into a database anyway I also had a server installation to begin with. The rest (after removing the DHCP server role...) was just copy and paste. If you are trying to get some DHCP server to spill its beans on a standard client - maybe even a corporate client machine restricted by a crapload of policies - you should install the Remote Server Admin Tools instead.

The tools also contain the DLL-File DHCPmon.dll (32 an 64 Bit) as well as the corresponding DHCPmon.dll.mui-Files. Please don't bother understanding why Microsoft decided on irritating all its users with this funny little scheme of putting everything where your would certainly not think it belongs.


64Bit DHCPmon.dll -> %windir%\System32\
32Bit DHCPmon.dll -> %windir%\SysWOW64\
64Bit mui -> %windir%\System32\en-US\
32Bit mui -> %windir%\SysWOW64\en-US\


I really hope that helps all your DHCP server-ish needs!

Wireless awesomeness

Nachdem ich mir schon im letzten Jahr die überaus günstige, toll verarbeitete und schicke HP TouchPad Wireless Tastatur geholt habe, hatte ich nun endlich die Möglichkeit, diese auch an meinem Windows 7 Client anzuschließen. Einziges Problem: HP hat sich eine minimal andere Tastenbelegung ausgedacht. Leider waren davon ausgerechnet die wichtigen Tasten <> und | betroffen. Für die Programmierung also leider vollkommen ungeeignet.

"Wireless awesomeness" vollständig lesen

Multiboot: OSX86/Debian 6.0

Debian 6.0 ist raus, und ich sollte neuen Systemen ja auch eine Chance geben (auch wenn ich wohl wieder zurück zu Arch wechseln werde). Erste positive Überraschung: Der Startbildschirm vom Installer hat eine kleine Rakete als Bild. Schick :-) Ich bin überzeugt.

Die textbasierte Installation läuft Linux-üblich problemlos ab, die Partitionierung ist bei mir wieder etwas weniger Standard, und sieht wie folgt aus:


  • dm_crypt-Volume 150GB

  • die verschlüsselten 150GB als Logical Volume Manager einsetzen

  • 10G root

  • 5G var für Kompilationen usw.

  • 5G tmp

  • 4096*1.3M swap

  • Rest home




Warum LVM? Weil ich es kann. Außerdem kann man im dm_crypt-Volume keine weiteren Partitionen mehr anlegen, und ich lagere bei meinen Linux-Systemen gerne Partitionen aus. Der LVM hat den Vorteil, dass sich home verkleinern und var vergrößern lässt.

Der erste Neustart ist ein wenig ernüchternd, da OSX10.6 nicht sofort erkannt wurde, aber das Internet ist hier ein weiteres Mal ein unschätzbarer Helfer. Folgender menuentry muss in der Datei /boot/grub/grub.cfg nach den normalen Einträgen ergänzt werden, damit Snow Leopard erkannt wird:


menuentry "OSX86" {
insmod hfsplus
set root=(hd0,1)
multiboot /boot
}



hd0,1 ist meine erste Partition auf Festplatte 1, die Partitionsbenennung unter Grub2 hat sich etwas geändert. Mit dieser Konfiguration lädt die Standard-Hackintosh-Installation problemlos. Worauf man beim Nachmachen achten sollte: Deaktiviert man z.B. die WLAN-Karte unter Linux, kann sie unter OSX auch nicht mehr genutzt werden, die Hardware wird anscheinend immer per RFKILL oder so deaktiviert. Vielleicht finde ich dazu noch eine Lösung, bis es soweit ist, lasse ich einfach immer alles an.

Oh(SX86) du Fröhliche...

Kurz vor Weihnachten muss mal wieder etwas geschafft werden! Die fade Berufsschulzeit habe ich mir schon mit C# und diversen Experimenten mit Linux verschönert (Hylafax, UMTS, integrierte Webcam), und nun habe ich versucht, OSX Snow Leopard auf mein gutes Thinkpad X60 und auf mein kleines Fujitsu-Siemens P7230 zu braten - Mit gemischtem Erfolg...

"Oh(SX86) du Fröhliche..." vollständig lesen

Android FTW!

Mein HTC Desire hat mir ja quasi schon vor dem Kauf gefallen. Seit ich es an diesem Wochenende aber endlich gerootet habe, bin ich völlig begeistert! Mit dem Tool unrevoked hat es nicht einmal 10 Minuten zum root gebraucht. Danach kam pays-ROM drauf mit LauncherPro Plus, und ieee802.11n-Unterstützung! Insgesamt läuft das HTC nun auch flotter. Der Ladebildschirm ist nun endlich schwarz, und macht keine nervigen Geräusche mehr beim Booten des Smartphones.


Als nächstes wird sich in's Firmen-VPN verbunden mittels vpnc und dem errechneten Gruppen"secret", welches sich recht einfach bestimmen lässt. Dann läuft auch die Exchange-Verbindung... Wenn das funktioniert, wird ein nandroid-backup erstellt und die nächste ROM ausprobiert. Meine Wahl ist dabei wegen noch mehr Features auf LeeDroid gefallen.

Der neue Recovery-Loader clockwork-mod ist übrigens großartig: Ein komplettes Systembackup mit einem Tastendruck, und die Möglichkeit, unsignierte ROMs, Updates usw. einzuspielen, ohne den S-OFF-Switch zu setzen. So wird nicht mal die Garantie des Gerätes angetastet :-)

WTF?!

"Argument cannot be null" - Ahja... F-Spot verweigert auf meinem Arch-Linux-X60 einfach seinen Dienst. Der Aufruf in der Shell liefert dann noch den Stack Trace, mit dem Hinweis, dass die Mono-Libraries defekt seien. Interessant hierbei: monoDevelop und diverse andere Applikationen laufen völlig normal.

"WTF?!" vollständig lesen