MNH Gedankensprudel

nicht nur ein stilles Wasser

PDLib Installation auf Debian mit Sury repository

07.09.24 (Allgemein)

Für Nextcloud Recognize brauchte ich die PHP Erweiterung PDLib das Projekt bietet leider keine Paketinstallation für Debian 12.
Da ich aber sowieso eine Multi PHP Installation mittels den Paketen von https://packages.sury.org/php/ nutze war sowieso selbst Kompilieren angesagt.

Die Anleitung erhaltet ihr eigentlich bereits auf der GitHub Seite des Projekts, für die Bereitstellung der Erweiterung für mehrere PHP Versionen sind allerdings ein paar Anpassungen nötig.

Den ersten Teil einfach nach Anleitung:

Benötigte Pakete installieren:

sudo apt install build-essential cmake libx11-dev php8.3-dev #php-DEINE.VERSIONSNUMMER-dev

DLib Instalieren:

cd /opt
git clone https://github.com/davisking/dlib.git
cd dlib/dlib
mkdir build
cd build
cmake -DBUILD_SHARED_LIBS=ON ..
make
sudo make install

Die eigentliche PDLib Erweiterung:

cd /opt
git clone https://github.com/goodspb/pdlib.git
cd pdlib

Hier die Schritte die ich verwendet habe. Dabei ist 8.3 gegen eure PHP Version auszutauschen und das ganze für jede installierte Version durchzuführen. –always-make dient hier der sauberen neu Erstellung nach dem ändern der PHP Version mit phpize und configure ein make clean schadet dabei auch nicht 😉

phpize8.3 
./configure --with-php-config=/usr/bin/php-config8.3
make --always-make
sudo make install

Quellen:

  1. Building PHP extensions — PHP Internals Book
  2. PDlib Installation · matiasdelellis/facerecognition Wiki (github.com)

Keine Kommentare »

ssh-copy-id für die Windows Powershell

18.08.24 (Allgemein)

Das nachfolgende Beispiel verwendet zum bereitstellen „Auto-load scripts on PowerShell startup“:

Allerdings habe ich den teil mit $psdir=“D:\Documents\Powershell\Scripts\autoload“ gegen“$env:USERPROFILE\Documents\WindowsPowerShell\autoload“ getauscht

lege die Datei ssh-copy-id.ps1 vom nachfolgend verlinkten gist im Verzeichnis %USERPROFILE%\Documents\WindowsPowerShell\autoload ab:

Keine Kommentare »

myopenhab onlinestatus grabber

17.08.21 (Allgemein)

Wer viel im Smarthome bastelt möchte manchmal wissen warum etwas nicht mehr geht.

Ist die config nun falsch oder doch der Dienst mal wieder offline wegen dem Internet?

Openhab bietet zwar die Möglichkeit den zustand von Services und Things anzuzapfen, aber leider bekommt man darüber nicht heraus ob der Cloud Service gerade offline oder online ist.

Zu diesen zweck habe ich mir ein kleines PHP Scrip geschrieben das den „Cloud Status“ auf der Homepage abfragt und als json zu Verfügung stellt.

Vorbereitung: Installiere PHP und die benötigten Extensions:

Um dieses noch in openhab selber zu nutzen verwende ich ein exec Thing und php auf dem openhab host.

Im folgend nun eine Anleitung wie dies zu Installieren ist.
Als erstes die Abhängigkeiten installieren sudo apt install php-cli php-curl php-xml wget und danach Installation prüfen:

php -m | egrep "xml|curl"
 curl
 libxml
 xml
 xmlreader
 xmlwriter

Skript nach "/etc/openhab/bin" herunterladen (am Ende des Artikels auch nochmal verlinkt):

mkdir /etc/openhab/bin && wget https://gist.githubusercontent.com/carschrotter/4d3d26867edbf254097cd72fbf21a67f/raw/382c17bb9126b3db3e535998daee43a340691ea1/myopenhab_onlinestate.php -O "/etc/openhab/bin/myopenhab_onlinestate.php"

nun kann ein erster Testlauf starten:

sudo -u openhab /usr/bin/php "/etc/openhab/bin/myopenhab_onlinestate.php" --username="MYUSERNAME" --password="MYPASSWORD" --cookie="/etc/openhab/misc/COOKIE.TXT"

Dabei wird versucht euch auf myopenhab.org anzumelden und das Cookie mit der Session ID unter /etc/openhab/misc/COOKIE.TXT gespeichert. Im Anschluss solltet ihr noch die Benutzerrechte sowie Schreib,- und Leserechte anpassen chown root:openhab "/etc/openhab/misc/COOKIE.TXT" und chmod 660 "/etc/openhab/misc/COOKIE.TXT"

Konfigurationsdatei anlegen:

nano "/etc/openhab/misc/myopenhab_conf.php" und folgenden Inhalt einfügen:

„MYUSERNAME“ und „MYPASSWORD“ sind natürlich wieder durch eure Logindaten zu ersetzen.
Auch hier solltet ihr die Rechte anpassen chown root:openhab "/etc/openhab/misc/myopenhab_conf.php" und chmod 640 "/etc/openhab/misc/myopenhab_conf.php"

Nun können wir schon mit dem einbinden in OpenHab anfangen. Dafür benötigt ihr das Exec Binding

Nun erstellt ihr als erstes ein Exec Thing wenn ihr eine sprechende UID wollt müsst ihr diese beim erstellen angeben. Alle anderen Parameter können auch noch später z.B. auch im YAML geändert werden. Als Befehl habe ich /usr/bin/php "/etc/openhab/bin/myopenhab_onlinestate.php" --conf="/etc/openhab/misc/myopenhab_conf.php" --cookie="/etc/openhab/misc/COOKIE.TXT" eingetragen. Den Status frage ich alle 3600 Sekunden ab also Jede Stunde ihr könnt aber auch 300 für z.B. alle 5 min eintragen.

Nach den speichern könnt ihr auch das Thing als Code bearbeiten

UID: exec:command:grab_myopenhab_onlinestate
label: myopenhab.org Status
thingTypeUID: exec:command
configuration:
  transform: REGEX((.*))
  interval: 3600
  autorun: true
  command: /usr/bin/php "/etc/openhab/bin/myopenhab_onlinestate.php"
    --conf="/etc/openhab/misc/myopenhab_conf.php"
    --cookie="/etc/openhab/misc/COOKIE.TXT"
  timeout: 15
Item Konfiguration für den Status

Skript um den Status abzurufen

Keine Kommentare »

VirtManager und KVM unter Ubuntu 20.10

30.01.21 (Allgemein)

Als erstes die benötigten Pakete:

sudo apt install -y qemu qemu-kvm qemu-utils libvirt-daemon libvirt-daemon-system libvirt-clients bridge-utils virt-manager gir1.2-spice-client-gtk-3.0

Keine Kommentare »

Samba funktioniert nach update nicht mehr

03.06.18 (Allgemein)

Hier eine Lösung sollte samba nach einen update von Debian streiken.
Hat mir bei meinen Raspbian weitergeholfen (Backup der Konfiguration nicht vergessen):

sudo apt-get clean && sudo apt update 
sudo apt-get remove samba 
sudo shutdown -r now 
dpkg -l | egrep '^ii' | awk '{print $2}' | grep samba | xargs 
sudo apt install --reinstall -o Dpkg::Options::=--force-confnew -y

https://forum-raspberrypi.de/forum/thread/37420-keine-freigabe-vom-pi-mehr/?postID=314136#post314136

Keine Kommentare »

mysql root Password vergessen und jetzt?

15.04.16 (Allgemein)

Folgendes Kurzes Tutorial geht davon aus das ihr screen unter Linux benutzt und zwei offene Fenster habt.

beendet euren MySQL Service z.B. mit  test

service stop mysql

oder

systemctl mysqld stop

Danach starten wir MySQL mittels mysqld_safe und schalten die grand Tabellen ab um ohne Passwort auf die Datenbank zuzugreifen

mysqld_safe --skip-grant-tables

und melden uns als root ohne Passwort auf unserer MySQL Console an.

mysql --user=root mysql

Im MySQL Terminalprogramm selber updaten wir nun das Passwort mittels dieses Befehls. Tauscht hier NEUESPASSWORT gegen euer neues Passwort aus.

update user set Password=PASSWORD('NEUESPASSWORT') where user='root';
flush privileges;
exit;

danach nur noch im zweiten screen Fenster MySQL wieder beenden mittels

mysqladmin -u root -p  shutdown

Hier könnt ihr bereits euer neues Passwort eingeben (NEUESPASSWORT).

Jetzt nur noch die Dienste wieder normal starten

service start mysql

oder

systemctl mysqld start

Und schon könnt ihr euch wieder einloggen.

Keine Kommentare »

Ich und Unitymedia…

13.03.16 (Allgemein)

Dieser Artikel dient erstmal hauptsächlich meinen Persönlichen Frustabbau aber auch als Warnung um nicht in den Kreis der leid genossenen zu Kommen.

Alles fing an einen schönen Mittwoch an als ich tatsächlich mal meinen Flyer von Unitymedia Beachtung schenkte: 1,99€ mehr im Monat dafür doppelte Bandbreite. Alleine die 6 Mbits Upload klangen verführerisch momentan gurke ich mit 2,5 Mbits rum. Der Rest mit 120 Mbits surfen klang auch nach einen „nice to have“. Da ich ein verwöhnter Altkunde bin der sich zum Glück nicht mit Gängelung wie DS-Lite oder schlechter Hardware (habe eine fritzbox 6340) rumärgern musste und sich über echten Dualstack mit ipv4 und ipv6 freut, mussten natürlich vorher Details geklärt:
werden.

Vorher natürlich schon gegoogelt… Ok die 6360 gibt es zu 120er Businesstarif und meine ist auch noch in der liste bis 200 Mbits sollte doch klappen.

Also der griff zum Telefon,

„behalte ich den auch meinen ipv4 (dualstack)“
Antwort: „JA Altkunden eigentlich immer“
„kann ich auch meine Fritz!box weiter benutzen“
Antwort: „JA, wahrscheinlich können sie ihren neuen Tarif sogar schon heute nutzen“

Von dieser Auskunft sehr erfreut, natürlich gleich abgeschlossen.

Am nächsten tag Tarif hat sich nicht geändert, dafür im Kundenmenü eine Paketankündigung. Ok mal eine Mail dorthin was das ist, mit vermerk auf die Zusicherung „meiner“* Fritzbox

Was kommt am Freitag? Eine „Connect Box“ misstrauisch das ding mal begutachtet und ohne an das Kabelnetz zu hängen mal die Oberfläche begutachtet. Ok könnte was werden ich sehe hier einen Modemodus und wenn ich meine Dualstack behalte, kann ich die wohl doch gebrauchen (Modem ist mir eh lieber). Ok mutiger schritt es ist Freitag Nachmittag ich hänge sie trotzdem ans Netz. Box blinkt und scheint irgendwann damit auch fertig zu sein.

Laptop test weise dran und die Ernüchterung: Vorher vorgenommen Einstellung natürlich weg unten auch die tolle Nachricht das sie auf DSlite läuft.

Also mal wieder Support angerufen dort hin und her nein das sollte nicht pasieren beim router könnten sie nichts machen mich aber wenigstens auf Duralsack wieder umstellen.

Nach dem ich also endlich bei einen Techniker in der Leitung war  erklärte der mir das die Firmware der Conectbox das garnicht könnte die läuft softwareseitig nur mit DSlite. Und stellte mich zu einer Dame weiter die sich mit meinen Belangen beschäftigen sollte. Der erklärte ich mein Anliegen, natürlich war ich nach so einen Martyrium auch nicht mehr der Höflichste, Und verwies auch mehrfach auf mein Telefonat mit den Vertragsabschluss (die mal nebenbei gesagt eigentlich bindend sind ansonsten kommt gar kein gültiger Vertrag zu stande naja zumindestens nach Fristverstreich der Nachbesserung…) Das passte der Dame wohl überhaut nicht und erklärte mir das ich als Privatperson überhaupt keine ipv4 bräuchte ich einen Buissnesvertragabschließen müsste und wenn ich eine Fritzbox möchte ich für 5€ mehr im Monat eine Telefon Connfort Option bräuchte. das härteste sie legte nach einer knappen Rückfrage ob ich das verstanden hätte einfach auf.

Also nochmal anrufen irgendjemand wird einen ja helfen können. Diesmal tatsächlich an jemanden kompetenteren geraten der mir wenigstens anbot meine alten Vertragsbedingungen wiederherzustellen, ich solle einfach meine Fritz box wieder anschließen und er leite alles weitere ein.

Nun sehr genervt dafür aber mit einen vermeintlich wieder funktionierenden*(dazu später mehr) Dual stack Anschluss wen auch wieder mit nur 50/2.5mbit also mal das gemacht was alle foren so empfehlen seinen Frust auf Facebook gepostet:

https://m.facebook.com/Unitymedia/posts/1137595382925523

*zwischenzeitlich stellte sich heraus das mein Internet zwar wieder geht und ich keine zwangsdrossel mehr über mein Handymodem brauche aber das Telefon nicht. den das wurde vergessen zu provisionieren.

wie es weitergeht und ging packe ich in einen zweiten Post….

Keine Kommentare »

praktische regex für netbeans und php

06.01.16 (Allgemein)

Das Suchen und ersetzen Feld in Netbeans (STRG+H) ist sehr praktisch vorallem mit regex

ein par regex meiner täglichen arbeit sollen hier nun veröffentlicht werden für alle die sie gebrauchen können oder damit ich sie selber nicht vergesse:

Alte array() schreibweise in php > 5.4 „[]“ Arrays

Find What:array\(([^\(\)]*)\)
Replace With:[$1]
leider muss dieser mehrmals angewendet werden bei Verschachtelungen trotzdem bekommt man damit in nu eine Konfigurationsdatei die deutlich kleiner und aufgeräumter ist.

Keine Kommentare »

Raw code in pilight gui mit eigenen Protokoll 2

01.10.15 (Allgemein)

Nun komm der in diesen Beitrag bereits versprochene zweite Teil…

On Off SoOONY DAS GEHT*

Ganz so arg müssen wir uns nicht ärgern. Doch leider wird es auch nicht mit einen einfachen on/off funktionieren. Damit ihr nicht noch ZWEIHUNDERT PULS bekommt mache ich mal weiter.

nach einen ausführen der install.sh sollte das Protokoll zwar schon auswählbar und kompilierbar sein doch ein:

sudo pilight-send -H
Usage: pilight-send -p protocol [options]
         -H --help                      display this message
         -V --version                   display version
         -p --protocol=protocol         the protocol that you want to control
         -S --server=x.x.x.x            connect to server address
         -P --port=xxxx                 connect to server port
         -F --settings                  settings file

The supported protocols are:
         brennenstuhl                   Brennenstuhl Comfort
         byebyestandbye                 Bye Bye Standbye Switches
         clarus_switch                  Clarus Switches
         cleverwatts                    Cleverwatts Switches
         coco_switch                    CoCo Technologies Switches
         cogex                          Cogex Switches
         dio_switch                     D-IO Switches
         elro_ad                        Elro Home Easy Advanced Switches
         elro_hc                        Elro Home Control Switches
         elro_he                        Elro Home Easy Switches
         generic_dimmer                 Generic Dimmers
         generic_screen                 Generic Screens
         generic_switch                 Generic Switches
         generic_weather                Generic Weather Stations
         home_easy_old                  Old Home Easy Switches
         impuls                         Impuls Switches
         intertechno_old                Old Intertechno Switches
         intertechno_switch             Intertechno Switches
         kaku_dimmer                    KlikAanKlikUit Dimmers
         kaku_screen                    KlikAanKlikUit Screens
         kaku_screen_old                Old KlikAanKlikUit Screens
         kaku_switch                    KlikAanKlikUit Switches
         kaku_switch_old                Old KlikAanKlikUit Switches
         nexa_switch                    Nexa Switches
         openweathermap                 Open Weather Map API
         pollin                         Pollin Switches
         program                        Start / Stop / State of a program
         quigg_switch                   Quigg Switches
         raw                            Raw Codes
         relay                          GPIO Connected Relays
         rev1_switch                    Rev Switches v1
         rev2_switch                    Rev Switches v2
         rev3_switch                    Rev Switches v3
         selectremote                   SelectRemote Switches
         silvercrest                    Silvercrest Switches
         unitech                        Unitech Switches
         wunderground                   Weather Underground API
         x10                            x10 based devices

liefert leider noch nicht den gewünschten erfolg, wie wir unter „The supported protocols are“ sehen.

Quelltext

Fangen wir also mal an, uns den Quelltext anzuschauen. Also Zurück zu bhc9938d.c und dort die Init Funktion. Den dort müssen wir noch eigne dinge bekanntgeben.

//...
void bhc9938dInit(void) {
    protocol_register(&bhc9938d);
    protocol_set_id(bhc9938d, "bhc9938d");
    protocol_device_add(bhc9938d, "bhc9938d", "BHC9938D protocol");
    bhc9938d -> devtype = RAW;
    bhc9938d -> printHelp = &bhc9938dPrintHelp;
}
//...

beschäftigen wir uns zunächst mit printHelp hier setzen wir einen Funktionszeiger in diesen Fall auf eine Funktion die bhc9938dPrintHelp heißt. Ich würde hier ein ähnliches Namensschema vorschlagen also protokollnameFunktion um Namenskonflikte zu vermeiden.
mit einer pasenden Methode sind wir also schon so weit Hilfetexte auszugeben:

static void bhc9938dPrintHelp(void) {
    printf("\t Ich bin ein  Hilfreicher Text\n");
}

was noch fehlt sind die Parameter zum steuern und natürlich das Senden dafür ergänzen wir wieder die Initfunktion

void bhc9938dInit(void) {
    protocol_register(&bhc9938d);
    protocol_set_id(bhc9938d, "bhc9938d");
    protocol_device_add(bhc9938d, "bhc9938d", "BHC9938D protocol");
    
    options_add(&bhc9938d->options, 'u', "unit", OPTION_HAS_VALUE, CONFIG_ID, JSON_NUMBER, NULL, "^(3[012]?|[012][0-9]|[0-9]{1})$");
    options_add(&bhc9938d->options, 't', "on", OPTION_NO_VALUE, CONFIG_STATE, JSON_STRING, NULL, NULL);
    options_add(&bhc9938d->options, 'f', "off", OPTION_NO_VALUE, CONFIG_STATE, JSON_STRING, NULL, NULL);
    
    bhc9938d -> devtype = RAW;
    bhc9938d -> printHelp = &bhc9938dPrintHelp;
    bhc9938d -> createCode = &bhc9938dCreateCode;
}

options_add rufe ich hier gleich dreimal auf, einmal für Unit eine einfache numerische ID in meinen Fall von 1-3, und jeweils einmal für on und off.
Des weiteren noch ein Pointer auf die bhc9938dCreateCode Funktion die dem Protokoll das eigentliche leben Einhaucht.
Der Komplette Kode schaut bei mir dann so aus:

/*
 * File:   bhc9938d.c
 * Author: Michael Hegenbarth (carschrotter) <mnh@mn-hegenbarth.de>
 *
 * Created on 23. Januar 2015, 13:19
 */

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <math.h>

#include "../../pilight.h"
#include "common.h"
#include "protocol.h"
#include "log.h"
#include "json.h"
#include "bhc9938d.h"

#ifndef MODULE

__attribute__((weak))
#endif
    
const char * indent = "ttttt";

typedef enum { OFF, ON, UNKNOWN=-1 } switchState;

/*
 * code all codes for on and off state from piligt debug
 */
const char * codes[2][3] = {
    {
    "160 480 480 160 160 480 480 160 160 480 480 160 160 480 480 160 160 480 160 480 160 480 480 160 160 480 480 160 160 480 480 160 160 480 160 480 480 160 480 160 480 160 480 160 160 480 160 480 160 5440",
    "160 480 480 160 160 480 480 160 160 480 480 160 160 480 480 160 160 480 160 480 160 640 480 160 160 640 480 160 160 480 480 160 480 160 480 160 160 640 160 480 480 160 480 160 160 480 160 480 160 5440",
    "160 640 480 160 160 640 480 160 160 480 480 160 160 640 480 160 160 640 160 480 160 480 480 160 160 480 480 160 480 160 480 160 160 480 160 480 160 640 160 480 480 160 480 160 160 480 160 480 160 5440"
    }, //off codes (index 0)
    {
    "161 483 483 161 161 483 483 161 1683 483 161 161 483 483 161 161 644 161 483 161 483 483 161 161 483 483 161 161 483 483 161 161 483 161 644 483 161 483 161 161 483 161 483 483 161 483 161 161 5474",
    "160 480 480 160 160 480 480 160 160 480 480 160 160 640 480 160 160 480 160 480 160 480 480 160 160 480 480 160 160 480 480 320 480 160 480 160 160 480 160 480 160 480 160 640 480 160 480 160 160 5440",
    "160 480 480 160 160 480 480 160 160 480 480 160 160 480 480 160 160 640 160 480 160 480 480 160 160 480 480 160 480 160 480 160 160 480 160 480 160 480 160 480 160 480 160 480 480 160 480 160 160 5440"
    } //On codes (index 1)
};
bool strIsInt(const char * str, int * result){
    char * rest = NULL;
    int tmp = (int) strtol(str, &rest, 10);
    result = &tmp;
    return (bool) !(rest != NULL);
}


static void bhc9938dPrintHelp(void) {
    printf("t -u --unit=unitnumberttcontrol a device with this unitcodet (1|2|3)n");
    printf("t -t --ontttsend an on signaln");
    printf("t -f --offtttsend an off signaln");
/*
    printf("t -d --device="raw"ttraw code to tur on device n");
    printf("t -f -rawOff="raw"ttraw code to tur off device n");
    printf("%sraw code is devided by spacesn", indent);
    printf("%s(just like the output of debug)n", indent);
*/
}

static int bhc9938dCreateCode(JsonNode * code) {
    int unit = -1;
    switchState sState = UNKNOWN;
    double itmp = 0;
    
    int codeIndex = 0;
    
    char * rcode = NULL;
    char * pch = NULL;
    int i = 0;

    if(json_find_number(code, "unit", &itmp) == 0){
        unit = (int)round(itmp);
    }
    
    if(json_find_number(code, "off", &itmp) == 0){
        sState=OFF;
    } else if(json_find_number(code, "on", &itmp) == 0){
        sState=ON;
    }
    if(unit == -1 || sState == -1) {
        logprintf(LOG_ERR, "bhc9938d: insufficient number of arguments");
        return EXIT_FAILURE;
    } else if(unit > 4 || unit < 0) {
        logprintf(LOG_ERR, "bhc9938d: invalid unit range");
        return EXIT_FAILURE;
    } else {
    codeIndex = unit -1;
    rcode = strdup(codes[sState][codeIndex]);
    
    printf("nindex:t%dnsState:t%dncode:%sn", codeIndex, sState, rcode);
    
    pch = strtok(rcode, " ");

    while (pch != NULL) {
        
        bhc9938d -> raw[i] = atoi(pch);
        pch = strtok(NULL, " ");

        i++;
    }

    sfree((void *) &rcode);

    bhc9938d -> rawlen = i;
    }
    return EXIT_SUCCESS;
}

/*
// BHC9938D bhc9938d
*/
void bhc9938dInit(void) {
    protocol_register(&bhc9938d);
    protocol_set_id(bhc9938d, "bhc9938d");
    protocol_device_add(bhc9938d, "bhc9938d", "BHC9938D protocol");
    
    options_add(&bhc9938d->options, 'u', "unit", OPTION_HAS_VALUE, CONFIG_ID, JSON_NUMBER, NULL, "^(3[012]?|[012][0-9]|[0-9]{1})$");
    options_add(&bhc9938d->options, 't', "on", OPTION_NO_VALUE, CONFIG_STATE, JSON_STRING, NULL, NULL);
    options_add(&bhc9938d->options, 'f', "off", OPTION_NO_VALUE, CONFIG_STATE, JSON_STRING, NULL, NULL);
    
    bhc9938d -> devtype = RAW;
    bhc9938d -> printHelp = &bhc9938dPrintHelp;
    bhc9938d -> createCode = &bhc9938dCreateCode;
}

#ifdef MODULE

void compatibility(struct module_t *module) {
    module -> name = "bhc9938d";
    module -> version = "0.1";
    module -> reqversion = "5.0";
    module -> reqcommit = NULL;
}

void init(void) {
    bhc9938dInit();
}
#endif

Quellcode Bei GitHub als Gist

*Mus man gesehen haben um das zu verstehen

Keine Kommentare »

Raw code in pilight gui mit eigenen Protokoll

23.01.15 (Allgemein)

Pilight sieht es offensichtlich nicht vor Rawcode von unbekannten Protokollen in der GUI zuzulassen, jedenfalls  gibt es laut Docu keine config dafür.

Dafür aber eine Anleitung wie man seine eigenen Protokolle implementieren kann.

Als erstes mal die Umgebung

Mein Umfeld:

Ich arbeite in diesen Beispiel mit Raspbian unter den Benutzer pi. Als Entwiklungsmaschine dient mir mein Windows 8.1 PC mit Netbeans 8.0.2.

Nachtrag: Ich gehe hier im Tutorial von der manuellen Installation aus sprich über das Git Repository dies ist auch notwendig um an den Sourcecode zu kommen.  Je nach dem unter welchen Beutzer ihr arbeitet oder wohin ihr die Dateien clont können die Pfade anderst sein

Entwicklungsumgebung/Editor:

Ich benutze bereits für meine Webprojekte Netbeans dort habe ich einfach die C++ Plugins installiert und schon kann es losgehen.
Ihr könnt natürlich eure favorisierte IDE oder Editor (z.B. Notepad++) verwenden.

Dateizugriff:

Um schnell kompelieren zu können belasse ich die Dateien auf dem rasperry pi und Kompeliere gleich dort, so muss man sich nicht mit Einstellungen für die passende Plattform rumärgern. Dazu mounte ich per sftp mein home Verzeichnis auf meine Entwicklungsmaschine. Das geht in Linux mit „Bordmitteln“ für Windos nutze ich momentan „SFTP Net Mount Free“. Natürlich könnt ihr das git repositorry aber auch auf die entwicklungs Maschine clonen.

Auf geht´s

So jetzt haben wir also was zum Editieren und Zugriff auf die Dateien dann kann es ja jetzt losgehen.
Als erstes navigieren wir zum Verzeichnis libs\protocols und erstellen dort zwei Dateien mit unseren Protokollnamen einmal „Protokollnamen.h“ und „Protokollnamen.c“.
Bei mir sieht es folgender masen aus:

~/pilight/libs/protocols/bhc9938d.h
~/pilight/libs/protocols/bhc9938d.c
          Pfad           Datein. Endung

Diese sollten auch noch gefüllt werden das geschieht jetzt streng nach Beispiel:

#ifndef _PROTOCOL_BHC9938D_H_
#define _PROTOCOL_BHC9938D_H_
 
struct protocol_t *bhc9938d;
void bhc9938dInit(void);
 
#endif
#include "../../pilight.h"
#include "common.h"
#include "protocol.h"
#include "bhc9938d.h"
 
#ifndef MODULE
__attribute__((weak))
#endif

//BHC9938D bhc9938d
void bhc9938dInit(void) {
    protocol_register(&bhc9938d);
    protocol_set_id(bhc9938d, "bhc9938d");
    protocol_device_add(bhc9938d, "bhc9938d", "bhc9938d protocol");
    bhc9938d->devtype = RAW;
}
 
#ifdef MODULE
void compatibility(struct module_t *module) {
    module->name = "bhc9938d";
    module->version = "0.1";
    module->reqversion = "5.0";
    module->reqcommit = NULL;
}
 
void init(void) {
    bhc9938dInit();
}
#endif

Dabei habe ich den Quellcode einfach aus den Beispiel übernommen und das Dummy Protokoll einfach gegen meinen eigenen Protokoll Namen sprich BHC9938D getauscht. Dabei immer schön auf Groß,- und Kleinschreibung achten und am besten den Formatierungsstiel beibehalten.
Damit das ganze mitcompeliert wird müssen wir noch zwei einträge machen:
Protokoll „definieren“ in CMakeConfig.txt:

set(PROTOCOL_BHC9938D ON CACHE BOOL "support for my own BHC9938D protocol")

Nun suchen wir in der Datei „CMakeLists.txt“ nach if(${PROTOCOL  bei mir ab Zeile 159 und fügen kurz davor unseren eigen Absatz ein um die Source Files bekannt zu machen:

if(${PROTOCOL_BHC9938D} MATCHES "OFF")
    list(REMOVE_ITEM pilight_headers "${PROJECT_SOURCE_DIR}/libs/protocols/bhc9938d.h")
    list(REMOVE_ITEM pilight "${PROJECT_SOURCE_DIR}/libs/protocols/bhc9938d.c")
endif()

Nach diesen beiden schritten kann das Protokoll zur Instillation ausgewählt werden

Probieren geht über studieren

Nun sind wir bereit das ganze zu testen.
Im folgenden gehe ich aus das ihr piligt schon mal erfolgreich installiert/compiliert habt wenn nicht könnt ihr gleich zum Punkt Erstellen wechseln.

Sicherheit geht vor

Als erstes fertigen wir ein Backup von /etc/piligh insbesondere unsere config.json wenn dort schon Geräte für die Weboberfläche eingetragen sind.

Reinemachen

Zuerst mal mit sudo service pilight stop den Service beenden. Danach sauber deinstallieren.
Ein ./setup.sh help bringt uns folgende Hilfe zu tage:

Usage: ./setup.sh [options]
         clean          remove all cmake and make generated files
         install        install pilight
         uninstall      uninstall pilight

also erstmal mit sudo ./setup.sh uninstall deinstallieren und danach mit sudo ./setup.sh clean saubermachen

Erstellen

nun einfach sudo ./setup.sh ausführen un ihr soltet folgende bild erhalten

Installation von pilight

Installation von pilight

Weiter geht es dann im Zeiten teil….

7 Kommentare »