Netatmo Security Cam Stream in ioBroker VIS anzeigen

Einleitung

Die Netatmo Security Kamera ist ein beliebtes Sicherheitsprodukt, das viele Anwender aufgrund seiner einfachen Bedienbarkeit und hervorragenden Leistung schätzen. In letzter Zeit hat sich jedoch eine Änderung abgezeichnet: Netatmo wird demnächst nicht mehr über den statischen Schlüssel lokal erreichbar sein. Zum anzeigen des aktuellen Bildes muss man nun auf die URL zurückgreifen die die API liefert – das ist einfacher 😉

In diesem Blog-Beitrag werden wir uns anschauen, wie wir die dynamische URL vom Adapter nutzen können, um die Netatmo Security Kamera in die VIS-Oberfläche des ioBrokers einzubinden.
Da das m3u8-Format nicht direkt abspielbar ist, zeige ich eine Lösung mittels Node Red und iFrame in VIS in Kombination mit dem HLS.js Framework. Zusätzlich erläutere ich die Verwendung von HLS.js und die Umsetzung ohne HTTPS.
‼️ Zur Anzeige nutze ich Fully Kiosk Browser auf einem Lenovo Tab M10, Android version 10 (SDK 29), Webview version 112.0.5615.101

Für diejenigen, die ihre VIS und Kamera per HTTPS erreichen möchten, empfehlen ich die Nutzung eines HTTPS-Reverse-Proxy wie Traefik. Man muss nur die Daten noch so umschreiben, dass sie nicht von der lokalen Kamera kommen, sondern über den Reverse Proxy 🙂 siehe Schritt 5

HLS.js: Ein kurzer Überblick

HLS.js ist eine JavaScript-Bibliothek, die das Abspielen von HTTP Live Streaming (HLS) in Webbrowsern ermöglicht, ohne dass Plug-ins wie Flash oder Silverlight erforderlich sind. Es ist eine effiziente und leichtgewichtige Lösung für die Wiedergabe von Live- und On-Demand-Videos auf verschiedenen Geräten und Plattformen. HLS.js ist besonders nützlich, wenn es darum geht, das m3u8-Format in der VIS-Oberfläche des ioBrokers abzuspielen.

Webcam-Daten

  1. Wir erstellen einen Http-In den wir “WebcamData” nennen
  2. wir rufen den ioBroker Value für den Stream ab –> Objekt ID netatmo.0.<meine ID>.live.stream
  3. wir schreiben die URL so um, dass wir direkt auf die Variante mit der hohen Auflösung zugreifen können:
    msg.url = msg.payload.replace("index_local.m3u8", "files/high/index_local.m3u8")
  4. Wir rufen per http request die Daten ab
  5. nur in meinem Fall schreibe ich die Daten noch so um, dass sie über meinen Reverse Proxy kommen. Am einfachsten geht das hier durch das 3malige Aufrufen des Replace-Befehls in Schritt 3 . Pro Aufruf wird immer nur das erste Vorkommen ersetzt.
  6. Ausgabe Beispiel:
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-MEDIA-SEQUENCE:22642
#EXT-X-TARGETDURATION:2
#EXTINF:2.000000,
http://192.168.103.7/&lt;DEIN KEY>/live/files/high/live0000022642.ts
#EXTINF:2.000000,
http://192.168.103.7/&lt;DEIN KEY>/live/files/high/live0000022643.ts
#EXTINF:2.000000,
http://192.168.103.7/&lt;DEIN KEY>/live/files/high/live0000022644.ts
VIS Snippet
[
    {
        "id": "bcaf9458c50d0965",
        "type": "http in",
        "z": "9b763ff35c5feced",
        "name": "",
        "url": "/WebcamData",
        "method": "get",
        "upload": false,
        "swaggerDoc": "",
        "x": 790,
        "y": 680,
        "wires": [
            [
                "0ece15db4c681fc0"
            ]
        ]
    },
    {
        "id": "0ece15db4c681fc0",
        "type": "ioBroker get",
        "z": "9b763ff35c5feced",
        "name": "live stream url",
        "topic": "netatmo.0.5838xxxxxxxxxxxxxxxxxxxxxxx.live.stream",
        "attrname": "payload",
        "payloadType": "value",
        "errOnInvalidState": "nothing",
        "x": 800,
        "y": 740,
        "wires": [
            [
                "b6c21be160385f63"
            ]
        ]
    },
    {
        "id": "ce26be8ca988bd7e",
        "type": "http response",
        "z": "9b763ff35c5feced",
        "name": "http Ausgabe",
        "statusCode": "",
        "headers": {},
        "x": 1350,
        "y": 820,
        "wires": []
    },
    {
        "id": "c2d4e4e1c14f825b",
        "type": "http request",
        "z": "9b763ff35c5feced",
        "name": "",
        "method": "GET",
        "ret": "txt",
        "paytoqs": "ignore",
        "url": "",
        "tls": "",
        "persist": false,
        "proxy": "",
        "insecureHTTPParser": false,
        "authType": "",
        "senderr": false,
        "headers": [],
        "x": 1170,
        "y": 820,
        "wires": [
            [
                "ce26be8ca988bd7e"
            ]
        ]
    },
    {
        "id": "b6c21be160385f63",
        "type": "function",
        "z": "9b763ff35c5feced",
        "name": "URL umschreiben auf konkreten Endpunkt",
        "func": "msg.url = msg.payload.replace(\"index_local.m3u8\", \"files/high/index_local.m3u8\")\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 880,
        "y": 820,
        "wires": [
            [
                "c2d4e4e1c14f825b"
            ]
        ]
    }
]

Um den Stream anzuzeigen, verwenden wir in VIS das Element iFrame. Damit das etwas anzeigen kann, brauchen wir noch eine Webseite. Diese erstellen wir ebenfalls über den http-Endpunkt in Kombination mit Handlebars (node-red-contrib-handlebars). Eigentlich dient das Element dazu bestimmte werte dynamisch zu ersetzen, aber die Funktion nutzen wir hier nicht, da der Daten-Endpunkt fest ist, aber intern dynamisch erzeugt wird 🙂

VIS Snippet
[
    {
        "id": "a0e0a38d585869e7",
        "type": "http in",
        "z": "9b763ff35c5feced",
        "name": "",
        "url": "/WebcamLive",
        "method": "get",
        "upload": false,
        "swaggerDoc": "",
        "x": 330,
        "y": 120,
        "wires": [
            [
                "e004230d2dc43ac0"
            ]
        ]
    },
    {
        "id": "54a4f4f63669c3e7",
        "type": "http response",
        "z": "9b763ff35c5feced",
        "name": "",
        "statusCode": "",
        "headers": {},
        "x": 750,
        "y": 120,
        "wires": []
    },
    {
        "id": "e004230d2dc43ac0",
        "type": "handlebars",
        "z": "9b763ff35c5feced",
        "name": "Page",
        "sourceProperty": "payload",
        "targetProperty": "payload",
        "query": "&lt;!DOCTYPE html>\n&lt;html>\n\n&lt;head>\n\t&lt;title>Netatmo Security Stream&lt;/title>\n\t&lt;script src=\"https://cdn.jsdelivr.net/npm/hls.js@latest\">&lt;/script>\n&lt;/head>\n\n&lt;body>\n\t&lt;video id=\"my-video\" controls autoplay muted style=\"width:85%; height:auto;float:left\">&lt;/video>\n\t&lt;button style=\"width:14%;height: 70px; float:left\" id=\"mute-toggle\">Ton ein/aus&lt;/button>\n\n\t&lt;button style=\"margin-top:10px; width:5%;height: 70px; float:left\" id=\"lautstaerke-hoch\">Laut&amp;shy;st&amp;auml;rke +&lt;/button>\n\t&lt;input style=\"margin-top:10px; width:4%;height: 65px; float:left;text-align: center;\" id=\"lautstaerke-value\" value=\"0\" />\n\t&lt;button style=\"margin-top:10px; width:5%;height: 70px; float:left\" id=\"lautstaerke-runter\">Laut&amp;shy;st&amp;auml;rke -&lt;/button>\n\n\n\t&lt;script>\n\t\tvar video = document.getElementById('my-video');\n\t\tvar videoSrc = 'http://192.168.0.100/WebcamData';\n\t\tvar muteToggle = document.getElementById('mute-toggle');\n\t\tvar lautstaerkeHochButton = document.getElementById('lautstaerke-hoch');\n\t\tvar lautstaerkeRunterButton = document.getElementById('lautstaerke-runter');\n\t\tvar lautstaerkeValue = document.getElementById('lautstaerke-value');\n\t\n\t\t\n\t\n\t\t// Überprüfen Sie, ob HLS.js unterstützt wird\n\t\tif (Hls.isSupported()) {\n\t\t\tvar hls = new Hls();\n\t\t\thls.loadSource(videoSrc);\n\t\t\thls.attachMedia(video);\n\t\t\thls.on(Hls.Events.MANIFEST_PARSED,function() {\n\t\t\t\tvideo.play();\n\t\t\t});\n\t\t} else if (video.canPlayType('application/vnd.apple.mpegurl')) {\n\t\t\tvideo.src = videoSrc;\n\t\t\tvideo.addEventListener('loadedmetadata', function() {\n\t\t\t\tvideo.play();\n\t\t\t});\n\t\t}\n\t\t\n\t\t// Schalten Sie den Ton des Videos ein oder aus, basierend auf dem Zustand des Schalters\n\t\tmuteToggle.addEventListener('click', function() {\n\t\t\tif (video.muted) {\n\t\t\t\tvideo.muted = false;\n\t\t\t\tmuteToggle.innerText = 'Ton ausschalten';\n\t\t\t\tlautstaerkeValue.value = (video.volume * 100).toFixed(0);\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\tvideo.muted = true;\n\t\t\t\tmuteToggle.innerText = 'Ton einschalten';\n\t\t\t\tlautstaerkeValue.value = \"0\";\n\t\t\t}\n\t\t});\n\n\t\t// Erhöhen oder verringern Sie die Lautstärke des Videos basierend auf dem Button, der gedrückt wurde\n\t\tlautstaerkeHochButton.addEventListener('click', function() {\n\t\t\tif (video.volume &lt; 1.0) {\n\t\t\t\tvideo.volume += 0.2;\n\t\t\t}\n\t\t\tvideo.muted = false;\n\t\t\tmuteToggle.innerText = 'Ton ausschalten';\n\t\t\tlautstaerkeValue.value = (video.volume * 100).toFixed(0);\n\t\t});\n\n\t\tlautstaerkeRunterButton.addEventListener('click', function() {\n\t\t\tif (video.volume > 0.0) {\n\t\t\t\tvideo.volume -= 0.2;\n\t\t\t}\n\t\t\tvideo.muted = false;\n\t\t\tmuteToggle.innerText = 'Ton ausschalten';\n\t\t\tlautstaerkeValue.value = (video.volume * 100).toFixed(0);\n\t\t});\n\t&lt;/script>\n&lt;/body>\n\n&lt;/html>",
        "x": 550,
        "y": 120,
        "wires": [
            [
                "54a4f4f63669c3e7"
            ]
        ]
    }
]
<!DOCTYPE html>
<html>

<head>
	<title>Netatmo Security Stream</title>
	<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
</head>

<body>
	<video id="my-video" controls autoplay muted style="width:85%; height:auto;float:left"></video>
	<button style="width:14%;height: 70px; float:left" id="mute-toggle">Ton ein/aus</button>

	<button style="margin-top:10px; width:5%;height: 70px; float:left" id="lautstaerke-hoch">Laut&shy;st&auml;rke +</button>
	<input style="margin-top:10px; width:4%;height: 65px; float:left;text-align: center;" id="lautstaerke-value" value="0" />
	<button style="margin-top:10px; width:5%;height: 70px; float:left" id="lautstaerke-runter">Laut&shy;st&auml;rke -</button>


	<script>
		var video = document.getElementById('my-video');
		var videoSrc = 'http://192.168.0.100:9091/WebcamData';
		var muteToggle = document.getElementById('mute-toggle');
		var lautstaerkeHochButton = document.getElementById('lautstaerke-hoch');
		var lautstaerkeRunterButton = document.getElementById('lautstaerke-runter');
		var lautstaerkeValue = document.getElementById('lautstaerke-value');
	
		
	
		// Überprüfen Sie, ob HLS.js unterstützt wird
		if (Hls.isSupported()) {
			var hls = new Hls();
			hls.loadSource(videoSrc);
			hls.attachMedia(video);
			hls.on(Hls.Events.MANIFEST_PARSED,function() {
				video.play();
			});
		} else if (video.canPlayType('application/vnd.apple.mpegurl')) {
			video.src = videoSrc;
			video.addEventListener('loadedmetadata', function() {
				video.play();
			});
		}
		
		// Schalten Sie den Ton des Videos ein oder aus, basierend auf dem Zustand des Schalters
		muteToggle.addEventListener('click', function() {
			if (video.muted) {
				video.muted = false;
				muteToggle.innerText = 'Ton ausschalten';
				lautstaerkeValue.value = (video.volume * 100).toFixed(0);
				
			} else {
				video.muted = true;
				muteToggle.innerText = 'Ton einschalten';
				lautstaerkeValue.value = "0";
			}
		});

		// Erhöhen oder verringern Sie die Lautstärke des Videos basierend auf dem Button, der gedrückt wurde
		lautstaerkeHochButton.addEventListener('click', function() {
			if (video.volume < 1.0) {
				video.volume += 0.2;
			}
			video.muted = false;
			muteToggle.innerText = 'Ton ausschalten';
			lautstaerkeValue.value = (video.volume * 100).toFixed(0);
		});

		lautstaerkeRunterButton.addEventListener('click', function() {
			if (video.volume > 0.0) {
				video.volume -= 0.2;
			}
			video.muted = false;
			muteToggle.innerText = 'Ton ausschalten';
			lautstaerkeValue.value = (video.volume * 100).toFixed(0);
		});
	</script>
</body>

</html>

in Zeile 20 steht dann die URL vom Endpunkt den wir eben angelegt haben der die m3u8 Datei ausliefert.

Dank Autoplay startet das Video im Fully Kiosk Browser auch sofort. Vom Layout sieht das so aus:

Screenshot beim laden der Seite, bevor Inhalte abgespielt werden.

Hinweis 1: Bei den Tests musste ich lokal den Werbefilter deaktivieren und autoplay wird in chrome z.b. nicht unterstützt – außer es ist eine lokale Webseite (glaube ich)

Hinweis2: das Video startet hier immer muted – das kann man im Video-Element auch entfernen.

Das gezeigte Beispiel kann natürlich auch für andere Kameras genutzt werden die m3u8 Dateien bereitstellen.

Weblinks:

  • https://hlsjs.video-dev.org/demo/

Veröffentlicht unter Heimautomatisierung, Javascript, Programmierung | Verschlagwortet mit , , , , , , , , , , , , , , , , , , , | 1 Kommentar

Hilfreiche Linux Tools

Wer mit Linux zu tun hat kennt sicher den einen oder anderen nützlichen Tipp mit welchem Programm man bestimmte Aufgaben schnell erledigen kann. Ich will hier mal eine kleine Liste erstellen. Wenn euch was fehlt, ergänzt es über die Kommentare.

Administration  / Netzwerk 

  • fail2ban – das darf auf keinem Server fehlen. Es überwacht Logmeldungen (z.b. SSH Server) und sperrt die IP für den Dienst, wenn innerhalb einer bestimmten Zeit Loginversuche fehlschlagen. Das klappt auch für FTP, HTTP, SMTP usw
  • iptstate: mit iptstate lassen sich unter anderem aktuelle Verbindungsdaten anzeigen (wahlweise sortiert nach Ports, Adressen etc.).
  • netcat: ein einfaches, aber mächtiges Tool zum Übertagen von Date(ie)n übers Netzwerk.
  • nethogs zeigt aktuelle Verbindungen an, über welche gegenwärtig Daten übertragen werden – natürlich mitsamt der Übertragungsgeschwindigkeit.
  • nmap mächtiger Portscanner.
  • tcpdump mit tcpdump lassen sich Netzwerkverbindungen mitschneiden (=sniffen).
    • vnStat: mit vnstat lässt sich der Traffic protokollieren und auswerten – dauert aber bis die ersten Statistiken verfügbar sind.
  • wget: mit wget lassen sich Dateien herunterladen und sogar komplexere Szenarien mit Logins und Rekursionen umsetzen. Damit kann man auch ganze Webseiten recht einfach downloaden.
  • tenshi: tenshi ist ein mächtiges Programm für das Log-Monitoring. Hiermit ist es möglich, bei bestimmten Logeinträgen automatisch eine Benachrichtigungsmail absetzen zu lassen oder sich täglich einen Logreport schicken zu lassen. Indem sich umfangreiche Filterregeln festlegen lassen, kann die Analyse sehr fein granuliert konfiguriert werden.
  • lynx – webbrowser auf der konsole
  • glances – das vielleicht bessere htop 🙂

System

  • htop: Ein interaktiver Task-Manager für die Konsole. Hat diverse Auslastungs- und Statusanzeigen, bietet einfache Prozessverwaltung und hat eine konfigurierbare Oberfläche.
  • iftop : zeigt Statistiken zum Interface an
  • iotop : Datei lese und schreibvorgänge anzeigen.
  • ncdu: mit ncdu lässt sich die Speicherplatzbelegung analysieren. Die bessere alternative zu “df –max-depth=1 -h”
  • sensors: mittels Eingabe von “sensors” lassen sich unter anderem die CPU-Temperaturen anzeigen.
  • df – Diskfree – zeigt die Belegung von Dateien an
  • whereis – wo liegt das binary
  • who  oder whoami – infos zum user

Sonstiges / CLI

  • cut: mit cut ist es beispielsweise möglich, Textzeilen “zurechtzustutzen” und so irrelevante Informationen herauszufiltern.
  • grep: grep wird verwendet, um Textdateien und -ströme auf bestimmte Zeichenfolgen hin zu untersuchen.
  • mc: der Midnight Commander, ein interaktiver Dateimanager für die Konsole mitsamt FTP-Support. Kann hier und da mal komfortabler sein als die Standard-Tools.
  • rsync: rsync kann Daten remote synchronieren.
  • sed: mit sed lassen sich Textströme manipulieren.
  • tail: tail kann beliebig viele der letzten Zeilen einer Datei ausgeben.
  • wc: wc kann Zeichen, Zeilen und Wörter zählen.
  • screen – virtuelle Konsolen, welche auf über das Sessionende hinaus erhalten bleiben können
  • man – Manuals  – zeigt die Hilfe zu einem Befehl an 
Veröffentlicht unter Linux | Verschlagwortet mit , , , | 1 Kommentar

Docker Container + CIFS (Samba / Windows) Share

Bei Docker sind Daten (Storage) im Container, oder auf dem Host. Alternative kann man einen Container als Datenspeicher definieren. Alle Lösungen sind suboptimal im Bezug auf Backups und Sicherheit.

Docker Volumes bieten aber noch mehr Möglichkeiten. Durch die verschiedenen Treiber kann man auch auf externe Ressourcen zugreifen.

Dabei kann man nativ u.a. über NFS auf Shares zugreifen oder über lokale Treiber z.B. auch auf Windowsfreigaben (via CIFS / Samba). 

 docker volume create \
	--driver local \
	--opt type=cifs \
	--opt device=//uxxxxx.your-server.de/backup \
	--opt o=addr=uxxxxx.your-server.de,username=uxxxxxxx,password=*****,file_mode=0777,dir_mode=0777 \
	--name cif-volume

nun kann man `cif-volume` in den Container reichen und auf einen pfad mappen.

Mit Docker-Compose geht das natürlich auch:

web:
  image: nginx
  volumes:
   - Share-templates:/etc/nginx/templates
  ports:
   - "8080:80"
  environment:
   - NGINX_HOST=foobar.com
   - NGINX_PORT=80

volumes: 
 Share-templates: 
   driver: local 
   driver_opts: 
     type: cifs 
     o: addr=uxxxxx.your-server.de,username=uxxxxxxx,password=*****,file_mode=0777,dir_mode=0777 device: //uxxxxx.your-server.de/backup
     device: //uxxxxx.your-server.de/backup

Mit so einem Storage können dann natürlich auch mehrere Container auf den gleichen Share zugreifen

Veröffentlicht unter Linux, Linux-Welt | Verschlagwortet mit , , , , , | Kommentar hinterlassen

Berechnung Passwortstärke in C#

In einem aktuellen Projekt besteht der Wunsch die Passwortstärke im Frontend anzuzeigen. Aber wie macht man das am besten. Was ein gutes Passwort ist weiß man ja.. aber wie berechnen 🙂

Man muss aber auch anerkennen, dass 20 Zahlen genauso sicher sind, wie z.b. ein kürzeres Passwort aber mit mehr Variation. Also z.B. Aki§23mE% 

Das heißt: Je komplexer ein Passwort ist, in Abhängigkeit von der Länge, desto sicherer ist es.

–> Der Code ist weiter unten 🙂

Beispiel: wenn ich nur Zahlen verwende, habe ich 10 Symbole. Bei einer Länge von Eins habe ich also eine Chance von 1:9 das richtige zu treffen. Bei 2 Zahlen sind es schon 100 Möglichkeiten u.s.w. Wenn ich Buchstaben nehme sind es 26, wenn ich Groß- und Kleingeschriebene nehme sind es 52.  

Aus dem Vortrag von Dr. Robert Formanek (Uni Hohenheim) (Link zur Präsentation):

Also N (Zeichenvorrat) hoch L (Länge des Passwortes) sind die Möglichkeiten => 95 ^6 => 735.091.890.625 Möglichkeiten (2^40 ==> 40 Bit Entropie) bei 6 Zeichen (a-z, A-Z,0-9 und Sonderzeichen). Wenn eine Grafikkarte also so rund 1Milliarde Passwörter pro Sekunde erproben kann würde es rund 17 Minuten Dauern. 

  • Bei 50Bit Entropie (7 Zeichen) dauert es schon 12 Tage (PC Baujahr 2011) 
  • Bei 52 Bit Entropie ( 8 Zeichen) würde es auf einem Amazon EC2 mit > 1000 Rechnern nur wenige Stunden dauern.
    • Bei über 65 Bit allerdings wohl >94 Jahre !

Werden jetzt “Wörter” verwendet wie Auto2Blume4 muss man neu denken. Da Auto und Blume hier eigene Symbole sind (Diceware) und hätte jetzt 2 Wörter + 2 zahlen.

Code

In unser Funktion muss als erstes bestimmt werden wie viele Zeichen wie nutzen könnten und dann kann man schon rechnen. Wir übergeben der Funktion also das passwort und den Bereich in der ASCII Tabelle von wo bis wo er schauen soll. Gibt es ein Zeichen aus dem Bereich gibt er uns die summe der bereiche zurück

 private int CountPossibleCharactersAndGiveBack(string password, params (int, int)[] range)
        {
            var RangeCount = range.Sum(p =&gt; Math.Abs(p.Item2 - p.Item1) + 1);
            foreach ((int, int) tuple in range)
            {
                if (password.ToCharArray().Any(p =&gt; p &gt;= tuple.Item1 &amp;&amp; p &lt;= tuple.Item2))
                {
                    return RangeCount;
                }
            }

            return 0;
        }

Das nutzen wir dann hier wo dann auch die Berechnung statt findet:

       public int CalcPasswortEntropie(string password)
        {
            var numberOfCharactersN = 0;
            numberOfCharactersN += CountPossibleCharactersAndGiveBack(password, (48, 57)); // Zahlen
            numberOfCharactersN += CountPossibleCharactersAndGiveBack(password, (97, 122)); // kleine Buchstaben
            numberOfCharactersN += CountPossibleCharactersAndGiveBack(password, (65, 90)); // große Buchstaben
            numberOfCharactersN += CountPossibleCharactersAndGiveBack(password, (32, 47), (58, 64), (91, 96), (123, 126)); // Sonderzeichen
            numberOfCharactersN += CountPossibleCharactersAndGiveBack(password, (128, 254)); // alles über 128 Akzente und so

            var lengthOfPassword = password.Length;
            var potenzNhochL = Math.Pow(numberOfCharactersN, lengthOfPassword);
            var entropie = Math.Log(potenzNhochL, 2);
            return (int)Math.Round(entropie, 0, MidpointRounding.ToPositiveInfinity);
        }

Das ganze wird noch gerundet nach oben und man hat die Bits die genutzt werden.

Abschließend noch eine Tabelle aus der Wikipedia zur Passwort Entropie, damit man ein Gefühl bekommt wie ein Passwort sein muss. Aber prinzipell reicht ein Passwort mit einer Entropie über 53. Besser ist mehr 😉

Lizenz des Codes: MIT

Veröffentlicht unter Nützliches | Verschlagwortet mit , , , , , | Kommentar hinterlassen

Broadlink RM 3 Mini + Apple TV Fernbedienung

Vor kurzem entdeckte ich den Broadlink RM 3 Mini und das ist wahrlich ein super “Gateway” in die Welt der nicht-WLAN-fähigen Geräte. Der kleine Kasten (10-25€) kann Infrarotsignale einer Fernbedienung lernen und wieder geben. Es gibt auch eine Handyapp dazu, wo man die Fernbedienung nachbilden kann. Ich möchte das aber im IoBroker nutzen.

Zum IOBroker nur kurz: Die Einrichtung des RM Mini 3 muss abgebrochen werden, sobald sich das Gerät mit eurem WLAN verbunden hat. Keine Zuweisung von Namen, Raum oder sonstewas. 

2. Hinweis IOBroker in der Aktuellen Version 2.0.x ist die Eingabe der IP Adresse noch nicht möglich (wenn ihr ein anderes SUBNET verwendet) – Installiert hier direkt von GitHub (Katze).

Wenn ihr nun versucht die Fernbedienung (2015er) anzulernen, werdet ihr feststellen, dass nur die Laut und Leiser Tasten erkannt werden 🙁 Denn(!) die anderen Tasten funktionieren per Bluetooth (juhu). Nichts destotrotz kann der Apple TV auch IR-Kommands auswerden. Und diese kann man manuell einfügen.

Zuerst im IOBroker die Taste Lauter und Leiser anlernen, damit der entsprechende Ordner angelegt wird. Bei mir hat er ihn L genannt … Jetzt dieses Ordner anklicken und dann (2) oben auf das PLUS drücken.

hier muss der State auf button gesetzt werden und unter NATIV muss ein Feld mit der Bezeichnung “code” angelegt werden. Hier kommt dann der eigentliche “Sendecode” rein. Den Namen im IOBroker kann man beliebig wählen. Am Ende sollte man in den Objekten einen Button sehen.

Codes:

Home

2600a8000001269511131337123712371213133712371237143613361435141114121214121212371237143713111312131311131413111312371313111312131213131313121213120005940001284913000c4e0001274a12000c4f0001274914000c4d0001274a12000c4f0001274a12000c4f0001274913000c4f0001274913000c4e0001274a12000c4f0001284814000c4e0001274912000c4f0001284913000c4e0001264a13000d05

Menu

260050000001269513121237133614361312123714361337123613371237131212131313121213371238123713111412121412131113131313361312121313121214111312131213120005950001264a13000d050000000000000000

OK

260098000001289b11151139103a11381313123812391139103a113912381214101510151015103a121410151139113911391015113912141138111511150f1510151114111510141100054d0001279c111411391239103a1114113911391239113a103912381115101413131015113a0f3a1114123812131214101510160f1511391115101511131115101510160f160f00054e0001284b11000d05

Back

260050000001289312131237133712371312133713371137143613361237141114121411131213361237153512141212121312141113131312371312141211131214121214111411140005930001274b11000d050000000000000000

Up

260050000001279413131137133713371213123614361336133613381137131311141212131214371212123713121338111312131313111312371511131212141114121311131312130005940001274a13000d050000000000000000

Down

260050000001279414121137143612371411123812371237133712371435131314101412121312371214111313361337131311131312131213371313111411131313111411131313120005940001274a13000d050000000000000000

Left

260050000001289312131337133612371412123614361237143614351238131212131312131213361336141213121237121411131312141213361312121313131312121312121313120005940001284913000d050000000000000000

Right

260050000001279314121237123713371214133513361436123713361436131311141312121213371214113713361312131411131510141112371412121312131312111413121213120005950001274917000d050000000000000000

Play

260098000001299a1213113a103a103a1214103a103a103a103a103a14361214121310151015103a113912381238113a1139121411381213123912131213101511141115101412141000054d0001279c1213113a1238103a1114113912381239103a103a123812131213111511151039113912141036161211151015111510151138121312140f151214101510160f151000054e0001274c10000d05

Stop

260050000001269414371114113712141212133712371336143612371336141113131312131313351336141213121214113712381213131212381114121312121312141212131312120005950001264a13000d050000000000000000

Pause

260098000001279c111510391338113911151039113911371439103a113912140f1612131015103a1139123811391239113911150f3a1213113911141214111411141114111411141200054c0001289b11141238123912381015103a1238113a1139113911391114121313121313103a103a1114113911151113121411150f15113911141115111311141213111412141000054e0001284a11000d05

Fast Forward

260050000001289313361411133811131214113713371336133614361336151013121312141212381114133514121435133613131212151015341413121212141113131213121412120005940001274a12000d050000000000000000

Fast Backward

260050000001279313381113133613121411143612371336133713361237141212131312131311381212141113371435123813121213131212371312131213121313121312141213110005950001274913000d050000000000000000

Skip Forward

260050000001289313351413133614121212123812371237133613371237141212131212141213361237133614121312131312361214111313371411131311131214121311141410130005940001274a12000d050000000000000000

Skip Backward

260050000001269512371214113713121313123712371436123712371337121412121312131212371337131311371213141213361213121312371312141213121214131013131312130005940001274913000d050000000000000000

Next Chapter

260050000001279313371213133613131212123713371436133612371336131312131213131212381236133712131313121214361411131213361313111411141114121213131312130005930001274a14000d050000000000000000

Prev Chapter

260050000001269413361213123713131213123712371337133613361536131213121213111313361535121313361412131212371214111313361313121312131313111312141114120005940001264b12000d050000000000000000

Video Mode

2600500000012793131314351237133712131237123713361337123714361213121312141212123713371237123713131336121412121312123615121312121313121313121312121200054d0001264a14000d050000000000000000
Veröffentlicht unter Heimautomatisierung | Verschlagwortet mit , , , , , , , , , | 1 Kommentar