Blog

Ich habe mich entschieden ein etwas größeres Projekt zu starten. Dabei handelt es sich um einen Wrapper, welcher die API des DVBViewer Media Servers in die .Net Welt übersetzt. Im Grunde übernimmt der Wrapper die gesamte Arbeit und kommuniziert mit dem Server. Wir können ganz einfach mit dem Wrapper arbeiten, in C# oder Visual Basic, und haben nicht das Gefühl, dass wir mit einer Web-API sprechen.

Wer nicht weiß, was der DVBViewer ist oder dessen Bruder den DVBViewer Media Server, der kann diesem Link folgen. DVBViewer Seite

Ich nutze den DVBViewer seit 2007 und habe gar keinen Receiver mehr in der Wohung stehen. Und egal wo ich auch bin, ich kann überall auf mein Fernsehprogramm, Aufnahmen oder Videos zugreifen. Ich programmiere meine Aufnahmen über einen Suchbegriff und der Server nimmt einfach alles auf, was dem Suchbegriff entspricht. Dabei lässt er sich einfach so einstellen, dass er auch keine Sendung doppelt aufnimmt. Der Server beherrscht auch eine Sprache, welche über das eigene LAN zu einem spricht. Man kann also mit dem Server reden und ihm sagen, was er quasi machen soll. Aufnahmen programmieren, nach Videos/Aufnahmen etc. suchen.

Mein Wrapper (Übersetzer) legt die Web-Api des Media-Servers auf die .Net Welt um. Bisher kann der Wrapper nicht viel, muss er aber auch nicht können. Die Programmierung dazu habe ich erst gestartet und der Focus liegt momentan darin, die Daten aus dem Server abzufragen. Die Daten direkt ändern, wird später hinzukommen.

Den Source-Code zum Wrapper habe ich aktuell in GitHub abgelegt: Link zum Repository

Zusätzlich schreibe ich eine Anwendung, welche den Wrapper direkt einsetzt und zeigen soll, was damit möglich ist. Bisher funktioniert bei ihr der Abruf der Aufnahmen, also die Recordings vom DVBViewer Media Server. Die Anwendung werde ich vorerst ohne Source zur Verfügung stellen. Den Quellcode dazu werde ich natürlich ebenfalls später veröffentlichen. Sie läuft ab Windows 7 unter x86 und x64. Sollte etwas nicht so funktionieren, wie es sein sollte, so könnt ihr dies gerne hier als Kommentar hinterlassen.

 Link zu Github:

https://github.com/Siox0911/DVBViewerServerApiWrapper

https://github.com/Siox0911/DMSApiWrapperDemo

Wie steuert man einen DC-Motor mit der H-Brücke L298N. Dieser Frage werde ich hier vollumfänglich nach kommen. Ich muss hier zugeben, dass ich die H-Brücke einfach so in Betrieb genommen habe. Ich schaute in die Datenblätter und sah, dass diese bis zu 40 Volt verträgt. Also habe ich einfach so die Brücke mit 24 Volt betrieben. Die Variante ist aber nicht wirklich dafür ausgelegt, was schnell für ein Wärmeproblem sorgt.

Was wir dafür brauchen ist ein DC-Motor, dafür reicht irgendein DC-Motor. Der DC-Motor hat 2 Anschlüsse. Ihr könnt die kleine Variante nehmen. 

günstiger DC Motor

Nach langem Suchen bin ich nie auf eine wirkliche Lösung gekommen. Aber nach dem ich mit Pollux2, aus dem Forum hier (falls eine forbidden Website erscheint, drückt noch einmal F5 um die Seite zu aktualisieren oder kopiert den Link in einen neuen Tab) ein wenig Konversation geführt hatte, habe ich die Lösung der Berechnung etc gelöst. Da solche Dinge immer mit der Community leben und sterben, möchte ich euch dies vorstellen.

Der Grundgedanke war und ist, wie messe ich Temperaturen mit der Standardfirmware des AVR-NET-IO?

Ihr könnt übrigens jeden anderen KTY81/XXX ebenso verwenden, aber ihr müsst dann die Berechnungen selbst erstellen, falls das nicht schon jemand für euch vorgenommen hat. Auch werde ich von Auflösung, Liniearisierung, URI und den Spannungsteiler schreiben. Aber dies sollte euch nicht davon abhalten, es einmal selbst zu versuchen. Ich werde die Themen entsprechend ausschmücken.

Für mich ist es der Versuch, ein kleines kostengünstiges IoT Projekt zu realisieren.

Ich habe bisher jedes Update problemlos installieren können. Nur bei diesem Update hat mein System das Update nicht akzeptiert und Windows in eine Art Schleife geschickt. Mein Problem bestand darin, dass mein Rechner vor einem Neustart 30% des Updates als Fortschritt anzeigte, dann eine Neustart vorgenommen wurde. Nach dem Neustart kam der Fortschritt bei 48% an und darauf folgte ein weiterer Neustart. Bei diesem Neustart bekam ich folgende Meldung...

Das Update konnte nicht installiert werden. Die Änderungen werden rückgängig gemacht.

Diesem Neustart folgten noch ein einige mehr. Danach war mein Desktop wieder da. Ein Blick in die Updates zeigte mir den Fehlschlag.

Am Ende konnte ich Windows doch dazu überreden, das Update anzunehmen. Doch dazu habe ich einige Schritte durchführen müssen. Als Hauptgrund nenne ich hier den Übeltäter. Dieser kommt bei mir in Form des NVidia-Treibers. Dieser überschreibt eine Datei im Komponentenspeicher. Scheinbar hat NVidia Probleme mit der Bibliothek opencl.dll und überschreibt kurzerhand diese Datei. Nun ist dies aber nicht mehr die Originale und sobald Updates folgen, kann es zu Problemen kommen. Das komische daran ist aber auch, dass Microsoft diesen Treiber über die Windows Updates ausrollt, dabei zulässt, dass diese Datei überschrieben wird. Es aber nicht für nötig hält die Datei als neues Original zu akzeptieren. Was noch viel krasser daran ist, dass Microsoft diesen Treiber zertifiziert obwohl dieser die Updatefunktion von Windows beeinträchtigt. Jeder normale User kann nicht erkennen, wo jetzt das Problem liegt. Und auch ich hätte am liebsten mein Windows platt gemacht. Aber das hätte das Problem auch nicht behoben.

Was noch viel tragischer ist: Statt den Usern eine echte Lösung zu bieten schlägt Microsoft vor, die Originale Datei nach Installation des Treibers wiederherzustellen, dann alles zu testen und wenn es der Treiber noch tut Windows temporär daran zu hindern, weitere Updates für Windows oder der Treiber zu installieren... Also langsam ist Microsoft zu lustig. Wer den Ratschlag von MS beherzigen möchte, der darf das hier gerne machen.

Wir hatten uns im 1.Teil mit dem Objekt selbst beschäftigt. Dabei ist mir ein kleiner Fehler unterlaufen. Ich habe ganz einfach die Konstruktoren vergessen. Über den Konstruktor wird ein Objekt erzeugt. Es gibt mehrere Möglichkeiten diesen einzusetzen. Als Standard ist bereits ein Konstruktor aktiv. Dieser wird vom Compiler selbst erzeugt. Aber auch nur dann wenn kein eigener Konstruktor in der Klasse steht. Diesen Konstruktor haben wir im 1.Teil bereits mehrfach eingesetzt.

Dim p As New Person

Dieser Aufruf ruft den Konstruktor "new()" auf, der automatisch vom Compiler in der Klasse Person erzeugt wurde. Schauen wir uns also noch einmal die Klasse Person komplett an und erweitern diese Klasse um einen oder mehrere Konstruktoren. Es gibt natürlich auch das Gegenteil, die sogenannten Destruktoren, aber darüber werden wir später reden.

''' <summary>
''' Öffentliche Klasse Person
''' </summary>
Public Class Person

    ''' <summary>
    ''' Enum mit der Auswahl des Geschlechts
    ''' </summary>
    Public Enum Sexes
        ''' <summary>
        ''' männlich
        ''' </summary>
        Male
        ''' <summary>
        ''' weiblich
        ''' </summary>
        Female
    End Enum

    Private _Gender As Sexes = Sexes.Female

    ''' <summary>
    ''' Setzt das Geschlecht einer Person oder gibt es zurück. Default = Weiblich.
    ''' </summary>
    ''' <returns>Das Geschlecht einer Person</returns>
    Public Overridable Property Gender As Sexes
        Get
            Return _Gender
        End Get
        Set(value As Sexes)
            _Gender = value
        End Set
    End Property

    Private _Weight As Integer

    ''' <summary>
    ''' Eigenschaft Gewicht. Setzt das Gewicht in Gramm oder gibt es in Gramm zurück.
    ''' </summary>
    ''' <returns>Gibt das Gewicht in Gramm zurück</returns>
    Public Property Weight As Integer
        Get
            Return _Weight
        End Get
        Set(value As Integer)
            _Weight = value
        End Set
    End Property

    Private _Size As Integer

    ''' <summary>
    ''' Eigenschaft Groesse. Setzt die Größe in Zentimeter oder gibt es in Zentimeter zurück.
    ''' </summary>
    ''' <returns>Gibt die Größe in Zentimeter zurück</returns>
    Public Property Size As Integer
        Get
            Return _Size
        End Get
        Set(value As Integer)
            _Size = value
        End Set
    End Property

    Private _Age As Integer

    ''' <summary>
    ''' Das Alter der Person
    ''' </summary>
    ''' <returns></returns>
    ''' <exception cref="System.ArgumentOutOfRangeException">Wird ausgelöst, wenn das Alter kleiner 0 und größer 150 ist.</exception>
    Public Property Age As Integer
        Get
            Return _Age
        End Get
        Set(value As Integer)
            If value >= 0 AndAlso value <= 150 Then
                _Age = value
            Else
                Throw New ArgumentOutOfRangeException("value", "Das Alter kann nur zwischen 0 und 150 liegen.")
            End If
        End Set
    End Property

    ''' <summary>
    ''' Erhöht das Alter um 1, wenn das Alter >= 0 ist
    ''' </summary>
    ''' <returns>True, wenn das Alter erfolgreich erhöht wurde, sonst false</returns>
    Public Function IncreasingAge() As Boolean
        If Age >= 0 Then
            Age = +1
            Return True
        Else
            Return False
        End If
    End Function
End Class

Wir erweitern diese Klasse um folgenden Code. Diesen Schreiben wir zwischen die Propertys und die Funktionen.

    ''' <summary>
    ''' Erzeugt eine Person als Objekt
    ''' </summary>
    Public Sub New()

    End Sub

Dies erzeugt einen Konstruktor, der durch "Dim p as new Person()" automatisch aufgerufen wird. Wir können auch mehrere Konstruktoren schreiben.

Unterkategorien