Archiv nach Schlagworten: PHP

433MHz Temperatursensor Reverse Engineering

Mein Ziel ist es die verschiedenen Außenfühler oder Außenthermometer anzuzapfen und die Daten über ein Microchip RN171 Modul im Netzwerk verfügbar zu machen (leider bisher noch Zukunftsmusik).
Hierfür habe ich mir auf Ebay ein Sende – und Empfangsmodul gekauft (~2€) und dieses an mein Picoscope angeschlossen. Die getriggerten Daten habe ich als CSV gespeichert und mittels PHP ausgewertet.

Ich habe mehrere Temperaturfühler und werde sie hier nach und nach hinzufügen.

Die Angaben sind alle selbst ermittelt und können bei anderen Systemen abweichen. Dieser Betrag gilt für mich als Gedankenstütze, die vielleicht jemand brauchen kann um bei dem gleichen Vorhaben ein bisschen weiterzukommen. Meine beste Quelle war hier folgender Beitrag:
http://www.mikrocontroller.net/topic/57829#449580

Fehler oder weitere Erkenntnisse sind jederzeit gerne willkommen. Ich hoffe irgendwann alle Bits jedes Datenpakets interpretieren zu können, gerne auch die Checksum 😐

Aldi Wetterstation Meteotime Sempre

(gekauft Herbst 2016)

Durch die Anzeige auf dem Außenfühler ist es relativ leicht die Temeratur und Luftfeuchtigkeit in den geloggten Daten wiederzufinden.
Als Übertragungsprotokoll wird hier der Biphase-Mark-Code verwendet. Der sieht im Fall der Wetterstation so aus:

AldiMeteotimeBiphaseMarkCode-1024x45 in

Biphase-Mark-Code der Wetterstation (aufbereitet)

Man sieht kurze und lange Takte, die Bedeutung ist relativ schnell erklärt. Nimmt man den kurzen Takt als Basis, dann ist überall dort wo kein Phasenwechsel ist eine „1“ zu deuten, dort wo ein Phasenwechsel stattfindet dementsprechend eine „0“.
Die Daten werden als Little-Endian übertragen, also das LSB zuerst.

Folgende Daten habe ich aufgenommen und ausgewertet:

                |<START->| ** ****                          kkkk tttt   TTTT    +  hhhhHHHH |<------CHECKSUM--------->|
17.0	43	1111110010 10 1111 00 1 011100111011110 110 0000 1110 1 1000 00111 11000010 111001111000110100100100100
17.1	45	1111110010 10 1111 00 1 011100111011110 110 1000 1110 0 1000 00111 10100010 111001111011010100011011000
17.2	46	1111110010 10 1111 00 1 011100111011110 011 0100 1110 0 1000 00111 01100010 111001111011010110101010110
17.3	46	1111110010 10 1111 00 1 011100111011110 101 1100 1110 1 1000 00111 01100010 111001111001010101000111010
17.4	45	1111110010 10 1111 00 1 011100111011110 110 0010 1110 0 1000 00111 10100010 111001111001110100001000010
17.5	45	1111110010 10 1111 00 1 011100111011110 101 1010 1110 1 1000 00111 10100010 111001111011110101001110010
14.1	42	1111110010 10 1111 00 1 011100111011110 110 1000 0010 0 1000 00111 01000010 011001111000111000100001010
15.4	42	1111110010 10 1111 00 1 011100111011110 011 0010 1010 1 1000 00111 01000010 011001111010010010111101101
16.7	42	1111110010 10 1111 00 1 011100111011110 011 1110 0110 1 1000 00111 01000010 011001111001011110101001110
17.3	42	1111110010 10 1111 00 1 011100111011110 011 1100 1110 1 1000 00111 01000010 011001111001110110111101011
24.0	42	1111110010 10 1111 00 1 011100111011110 110 0000 0010 1 0100 00111 01000010 011111111001001000010011001
24.6	41	1111110010 10 1111 00 1 011100111011110 011 0110 0010 1 0100 00111 10000010 011111111011101010110001101
-0.2	64	1111110010 10 1111 00 1 011100111011110 101 0100 0000 1 0000 00101 00100110 111001111000011110000000011
0.5	66	1111110010 10 1111 00 1 011100111011110 110 1010 0000 0 0000 00110 01100110 011001111010111110011101000
-17.8	41	1111110010 10 1111 00 1 011100111011110 110 0001 1110 0 1000 00100 10000010 011001111001100101000110110
-15.3	50	1111110010 10 1111 00 1 011100111011110 110 1100 1010 0 1000 00100 00001010 011001111000111001000011101
-13.1	56	1111110010 10 1111 00 1 011100111011110 011 1000 1100 1 1000 00100 01101010 011001111000011101011110101
-10.8	62	1111110010 10 1111 00 1 011100111011110 110 0001 0000 1 1000 00100 01000110 111001111010101111000111010
-6.6	69	1111110010 10 1111 00 1 011100111011110 110 0110 0110 0 0000 00101 10010110 011001111010001001100000011
// Batterien neu eingelegt
24.5	33	1111110010 11 0101 00 0 011100111011110 101 1010 0010 1 0100 00111 11001100 000011111111101111101110001
22.5	33	1111110010 11 0101 00 0 011100111011110 011 1010 0100 1 0100 00111 11001100 000011111111101010101011010
22.5	32	1111110010 11 0101 00 0 011100111011110 110 1010 0100 1 0100 00111 01001100 100011111101101000110000100
// Batterien neu eingelegt
24.1	33	1111110010 11 1001 00 0 011100111011110 011 1000 0010 0 0100 00111 11001100 000011111111111100001001110
23.8	32	1111110010 01 1001 00 1 011100111011110 110 0001 1100 1 0100 00111 01001100 100011111101100000010000010
23.8	32	1111110010 01 1001 00 1 011100111011110 011 0001 1100 1 0100 00111 01001100 100011111101100010111011110
// Batterien neu eingelegt
25.3	34	1111110010 11 0011 00 0 011100111011110 011 1100 1010 0 0100 00111 00101100 100011111101111100100101110
24.7	31	1111110010 11 0011 00 0 011100111011110 110 1110 0010 0 0100 00111 10001100 100011111111110110011110110
24.4	34	1111110010 00 0011 00 0 011100111011110 011 0010 0010 0 0100 00111 00101100 100011111101010100110110111
// Batterien neu eingelegt
23.7	30	1111110010 01 1001 00 1 011100111011110 011 1110 1100 1 0100 00111 00001100 000011111111010010001001000
23.9	31	1111110010 01 1001 00 1 011100111011110 011 1001 1100 0 0100 00111 10001100 100011111100100010000000011

* zufällig vergeben bei Batteriewechsel
k Temperatur floating-Byte
t Temperatur low-Byte
T Temperatur high-Byte
h Luftfeuchtigkeit low-Byte
H Luftfeuchtigkeit high-Byte

Hier noch ein paar Bilder der Wetterstation von außen und innen

Tmp 9754-20170104 1522391997708704-300x169 in Tmp 9754-20170104 1142401931758206-300x169 in Tmp 9754-20170104 114232-255450897-300x169 in

VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

mehrere Domains mit XAMPP (Apache)

Jeder, der mehrere Internetprojekte hat muss ab und zu oder immer die Dateien auch offline bearbeiten und testen können. Hierzu verwende ich XAMPP, das sowohl für Linux als auch für Windows kostenlos erhältlich ist.
Oft laufen aber die Projekte erst dann richtig wenn die Server-Root an der richtigen Stelle ist. Es funktionieren also aufgrund der verschiedenen Pfadangaben nicht alle Internetpräsenzen offline, wenn sie einfach in einem Unterordner der Serverroot abgelegt sind.
Abhilfe schaffen hier VirtualHost’s.

Um einen Virtualhost anzulegen müssen zwei Dateien editiert werden.
zuerst legen wir einen neuen Virtualhost in der httpd.conf – Datei an. Zu finden ist sie bei Linux mit XAMPP unter /opt/lampp/etc/httpd.conf.
Diese Datei ist wie man auf den ersten Blick sieht recht voll von Kommentaren, durch diese nicht irritieren lassen! An geeigneter Stelle (eigentlich egal wo) dann folgendes einfügen:


NameVirtualHost IPADRESSE

#####################################################
#            V I R T U A L H O S T S
#####################################################

        ServerName www.domain.loc
        ServerAlias domain.loc
        DocumentRoot "/opt/lampp/htdocs/domain"



        ServerName www.domain2.loc
        ServerAlias domain2.loc
        DocumentRoot "/opt/lampp/htdocs/domain2"

#####################################################

jetzt noch die IPADRESSE an die, des Rechners, auf dem XAMPP (Apache) läuft, anpassen. Wenn die Virtualhost nur lokal gebraucht werden kann man auch die IP-Adresse vom localhost 127.0.0.1 eintragen.
Unter ServerName und ServerAlias können beliebige domains stehen, sie müssen nur identisch zu der unten beschriebenen hosts – Datei sein

Jetzt kommen wir zur zweiten Datei, die hosts – Datei
Sie muss auf jeden Rechner angepasst werden der auf den Virtualhost zugreifen können soll.
Bei Linux ist diese Datei unter /etc/hosts zu finden, bei Windows unter /Windows/System32/drivers/etc/hosts.

Es muss folgendes eingetragen werden:

IPADRESSE    domain.loc www.domain.loc
IPADRESSE    domain2.loc www.domain2.loc

jetzt muss nur noch Apache neu gestartet werden, unter Linux mit

cd /opt/lampp
./lampp restart

so und jetzt nur noch in den Browser gehen und testen. Viel Spaß damit 😉

VN:F [1.9.22_1171]
Rating: 3.0/5 (2 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

search while typing

Auf fast jeder Homepage gibt es ein Suchfeld. Wenn man dort was eingibt ist man sich oft nicht wirklich sicher wie man den gesuchten Begriff schreibt. Google bietet ein Feld an, das während der Eingabe schon anfängt zu suchen und bietet einem Vorschläge.
Hierfür wird Javascript benötigt. Mit Hilfe von Javascript kann mittels AJAX eine PHP – Datei angesprochen werden, die z.B. eine MYSQL – Datenbank anspricht und von dort die Vorschläge holt.

Überwachen des Eingabefeldes

wir wollen Feststellen, ob eine Eingabe gemacht wurde. Sobald das erste Zeichen in dem Eingabefeld ladet soll auch schon nach Vorschlägen gesucht werden. Leider wie so oft muss für den Internet Explorer mal wieder eine gesonderte Version existieren siehe hierzu unter addEvent (fixed im Internet Explorer das Kommando „addEventListener“)

Hier unsere erste Funktion die das Eingabefeld überwacht:

var input_keywords;
function init()
{
	var input_keywords = document.getElementById("keywords");
	addEvent(input_keywords,"keyup",search);
}

über der Funktion wurde noch die Variable input_keywords definiert, sie muss hier global sein, weil sie später noch in mehreren Funktionen verwendet werden soll. Die Funktion init() sollte aufgerufen werden, sobald die Seite fertig geladen ist. Am einfachsten realisiert man das, indem man den HTML-Tag body wie folgt anpasst:

In der zweiten Zeile von der Funktion „init“ wird ein Event-Listener auf das Eingabefeld gesetzt. Dieses hat hier die id „keywords“, es wird beim loslassen einer Taste die Funktion search aufgerufen.

AJAX um die Vorschläge zu erhalten

ich verwende immer folgenden Code um ein AJAX – Object zu erstellen:

function erzXMLHttpRequestObject()
{
	var resObjekt = null;
	try
	{
		resObjekt = new ActiveXObject("Microsoft.XMLHTTP");			//Internet Explorer
	}
	catch(Error)
	{
		try
		{
			resObjekt = new ActiveXObject("MSXML2.XMLHTTP");
		}
		catch(Error)
		{
			try
			{
				resObjekt = new XMLHttpRequest();
			}
			catch(Error)
			{
				alert("Erzeugen eines XMLHttpRequest-Objekts ist fehlgeschlagen. Ajax ist nicht möglich");
			}
		}
	}
	return resObjekt;
}

um jetzt aber AJAX zu verwenden und unsere Vorschläge zu holen, brauchen wir noch folgenden Code:

function search(keywords)
{
        var http = null;
        http = erzXMLHttpRequestObject()
        if (http != null)
        {
           http.open("GET", "/search_while_typing.php?keywords=" + keywords, true);
           http.onreadystatechange = ausgeben;
           http.send(null);
        }
        function ausgeben()
        {
                if (http.readyState == 4)
                {
                        if(http.responseText.length > 0)
                        {
                                document.getElementById("search_result").innerHTML = http.responseText;
                                document.getElementById("search_result").className = "show";
                        }
                        else
                        {
                                document.getElementById("search_result").className = "hide";
                        }
                }
        }
}

wie man sieht sollen die Vorschläge in einem DIV-Container landen, der die id „search-result“ trägt. Die beiden Befehle mit dem className =“hide“|“show“; sprechen zwei CSS Klassen an, die den DIV verstecken oder bei Erfolg zeigen.
Der PHP-Datei werden die Suchbegriffe per URL übergeben. Die Variable trägt den Namen „keywords“

Die PHP Datei

um Vorschläge zu bekommen muss jetzt eine PHP – Datei vorhanden sein (hier: search_while_typing.php) die z.B. eine Verbindung zu einer Datenbank aufbaut und dort die nötigen Suchbegriffe sucht und an unsere Vorschlagsliste zurückgibt.

		

ganz oben werden mithilfe von „trim“ Leerzeichen und Zeilenumsprünge von dem Suchstring am Anfang und Ende entfernt. Danach werden Sonderzeichen „escaped“ mit Hilfe von Backslashes. Mit dem Befehl „preg_split“ wird der Suchstring an den Leerzeichen aufgespalten und in ein Array gespeichert.
Jetzt muss noch überprüft werden, ob die einzelnen Suchworte länger sind als ein Zeichen. Die Funktion „array_splice“ lässt hier nur eine maximale Anzahl von 4 Suchbegriffen zu. (In diesem Beispiel wird nur das erste Wort behandelt, es lässt sich aber einfach mit „AND“ und „OR“ in der MYSQL – Abfrage auf 4 zu suchende Wörter ‚aufstocken‘.
Nicht vergessen noch eine Datenbankverbindung aufzubauen. Jetzt können mit dem Beispiel- MYSQL-Befehl die Vorschläge gefunden werden. Diese werden dann weiter unten über die „while“-Schleife ausgegeben.

Optimierung und eigene Anpassung – Ideen zur Erweiterung

man könnte die Ausgabe in den Vorschlags-DIV in eine Liste umwandeln, ich hoffe man versteht was ich meine, also <ul> und <li>. Solche Listen lassen sich prima mit CSS formatieren.
Durch diese Liste könnte man zum Beispiel mit den Cursortasten rauf und runter navigieren und so einen bestimmten Vorschlag wählen. (die keycodes sind: UP: 38; DOWN: 40)
Des weiteren könnte man die Vorauswahl mit der Entertaste abschicken und dann an das eigentliche Suchscript der Seite weitergeben (keycode von Enter: 13)

Hier der Javascript-Code zum Abfragen einer Taste:

function check_key(event)
{
	event = event || window.event;
	if(event.keyCode == 38 || event.keyCode == 40 || event.keyCode == 13)
	{
	    ...
	}
}

Denkbar wäre bei „…“ eine Switchabfrage die dann die einzelnen Tasten behandelt.

<?php $keywords = $_GET[„keywords“]; if(trim($keywords)) { if(!get_magic_quotes_gpc()) $keywords = addslashes($search); if(strlen($keywords) < 50) { $searcharray = preg_split(‚/\s+/‘,$keywords); foreach($searcharray as $keyword) { if(strlen($keyword) > 1) { $search[] = $keyword; } } if(count($search) > 0) { array_splice($search,4); } //Hier muss noch eine Datenbankverbindung aufgebaut werden mysql_query(“ SELECT word FROM search_words WHERE word LIKE ‚%“.utf8_encode($keywords[0]).“%‘ ORDER BY word“); if(mysql_num_rows($result) > 0) { while($row = mysql_fetch_array($result)) { echo htmlentities($row[„word“]).“<br/>“; } } } } ?>
VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

nervige Leerzeichen und Zeilenumsprünge entfernen

Mit dem Befehl trim können nervie Leerzeichen und Zeilenumsprünge am Anfang und Ende eines Strings entfernt werden.

Hier ein Beispiel für C++

AnsiString test = " abcdefghijklm   ";
test = trim(test); //"abcdefghijklm"

analog auch in PHP

$test = " abcdefghijklm   ";
$test = trim($test); //"abcdefghijklm"
VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)