Ankündigung

Einklappen
Keine Ankündigung bisher.

Wieder einmal Perl

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [wiregate] Wieder einmal Perl

    Hallo,

    ich hab mich lange davor gedrückt aber ich versuche meine linknx logiken in Perl zu schreiben.

    Also zuerst dass wo ich Probleme hab:
    1.
    Code:
    my $Sonneneinstrahlung = '11/3/0';
    my $Aussentemp = '11/1/0';
    my $St;
    my $At;
    my $berechnung;
    my $differenzSoll;
    my $St2;
    $plugin_info{$plugname.'_cycle'} = 0;
    $plugin_subscribe{$Sonneneinstrahlung, $Aussentemp}{$plugname} = 1;
    
    if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $Sonneneinstrahlung) {
        $St = sprintf ("%.3f", $msg{'value'});
         #oder nur falls nicht importiert: $msg{'data'} ist dann leer/undef!
         #$St= decode_dpt9($msg{'data'});
         return $St;
         } 
         else { # zyklischer Aufruf
         # "9" (DPT) kann entfallen falls richtig importiert!
         $St= knx_read($Sonneneinstrahlung,300,9);
         my $St2 = sprintf ("%.3f", $msg{'value'});
         return $St2;
         }
         
     if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $Aussentemp) {
        $At= $msg{'value'};
         #der nur falls nicht importiert: $msg{'data'} ist dann leer/undef!
         #$At= decode_dpt9($msg{'data'});
         } 
         
         #else { # zyklischer Aufruf
         # "9" (DPT) kann entfallen falls richtig importiert!
         #$At= knx_read($Aussentemp,300,9);
         #}
     
     # my $berechnung = $St - $At;
     
     #if ($berechnung => $$differenzSoll) {
     #return "passt";
     #}    else {
     #return "mist";
     #}
    das ist nur ein Testscript und soll meine Temperaturen in einen String verwandeln. Nur leider tut es das nicht. Die Frage ist Warum? sprintf geht auf 3 Nachkommastellen, ich brauch nur 2, aber dass änder ich erstmal wenn er das tut was ich will...

    2.
    Seit dieses Script läuft meine ich eine deutlich höhere Prozessorlast zu haben. Wenn jemand drüber schauen könnte, ob das der Auslöser ist, wäre das sehr nett:

    Code:
    
    # do all configs here:
    my $knx_addr = '13/1/7'; # knx_address for volume up/down
    my $knx_addr_vol = '13/1/8';
    my $volumestep = 10;    # The stepsize for volume
    my $alsa_chanel = 'Software2';  # other possibility: Master
    my $sound_device = "mpdvol2";    # The Name of the alsa Sounddevice (asound.conf)
    my $knx_addr_player2 = '13/1/0';# mpd Player on/off GA
    my $volume_anfang = 80;     # This Volume will be set on start
    my $Port = "6601";        # Port of the mpd Instanz
    my $IP = "192.168.178.33";    # The IP where the mpd Instanz is running
    my $info_wz = '3/1/2';        # Info Switch wz
    #################################################################
    # do not change anything below, all config stays above
    #################################################################
    
    # subscribe plugin and call it only when necessary
    $plugin_subscribe{$knx_addr, $knx_addr_player2}{$plugname} = 1;
    $plugin_info{$plugname.'_cycle'} = 0;
    
    # Volume
    if ($msg{'dst'} eq ($knx_addr))
    {    
    
    if ($msg{'apci'} eq 'A_GroupValue_Write') # change volume
    
    {
    if ($msg{'value'} == 1) {
        my $debug = `amixer -D $sound_device set $alsa_chanel $volumestep+`;
        return;
    }
    
    if ($msg{'value'} == 0) {
        my $debug = `amixer -D $sound_device set $alsa_chanel $volumestep-`;
        return;
    }
    }
    }
    # Radio on/off
    if ($msg{'dst'} eq ($knx_addr_player2))
    {
    if ($msg{'apci'} eq 'A_GroupValue_Write') # change volume
    {
    if ($msg{'value'} == 1) {
        my $debug = `MPD_HOST=$IP MPD_PORT=$Port mpc play` && `amixer -D $sound_device set $alsa_chanel $volume_anfang%`;
        
        return "Player 2 läuft";
    }
    
    if ($msg{'value'} == 0) {
        my $debug = `MPD_HOST=$IP MPD_PORT=$Port mpc stop`;
        return "Player 2 aus";
    }
    }
    }
    
    # Ansage
    if ($msg{'dst'} eq ($info_wz)) {    #Küche Licht, Kaffee
    if ($msg{'apci'} eq 'A_GroupValue_Write')  {
        my $debug = `/var/www/sprachansage/./aussentemp.sh && /var/www/sprachansage/./vorhersage.sh && /var/www/sprachansage/./wohntemp.sh && amixer -D $sound_device set $alsa_chanel $volumestep%- && mpg123 -a mixing /tmp/hallo.mp3 /tmp/aktuelleaussentemp.mp3 /tmp/vorhersage.mp3 /tmp/wohnzimmer.mp3 && amixer -D $sound_device set $alsa_chanel $volumestep%+`;
        return "Ansage";
    }
    }
    
    
    
    
    
    if ($msg{'apci'} eq 'A_GroupValue_Read') # get volume
    {
      my $volume = `amixer -D $sound_device get $alsa_chanel | grep 'Left:' | sed 's/.*Playback \\([0-9]*\\) .*/\\1/'`;
      knx_write( $knx_addr_vol, $volume, 6 );
      return $volume; #"Figured out volume of $volume and sent it to $knx_addr";
    }
    Das ist das Script von ChrisM ein wenig umgebaut.

    oder ist es das:
    Code:
    my $volumestep = 10;    # The stepsize for volume
    my $alsa_chanel = 'Software2';  # other possibility: Master
    my $sound_device = "mpdvol2";    # The Name of the alsa Sounddevice (asound.conf)
    my $volume_anfang = 80;     # This Volume will be set on start
    my $Port = "6601";        # Port of the mpd Instanz
    my $IP = "192.168.178.33";    # The IP where the mpd Instanz is running
    my $kueche_licht = '3/1/0';    
    my $kaffee = '3/3/0';
    
    # Uhrzeit
    my ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings);
       ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings) = localtime();
    
    
    $plugin_subscribe{$kaffee, $kueche_licht}{$plugname} = 1;
    $plugin_info{$plugname.'_cycle'} = 0;
    
    
        
    # Ansage in der Früh
    if (($hour >= 4) && ($hour <= 10 )) {    #Küche Licht, Kaffee
        my $debug = `/var/www/sprachansage/./aussentemp.sh && /var/www/sprachansage/./vorhersage.sh && /var/www/sprachansage/./wohntemp.sh && amixer -D $sound_device set $alsa_chanel $volumestep%- && mpg123 -a mixing /tmp/gutenmorgen.mp3 /tmp/aktuelleaussentemp.mp3 /tmp/vorhersage.mp3 /tmp/wohnzimmer.mp3 && amixer -D $sound_device set $alsa_chanel $volumestep%+`;
        return "Ansage in der Früh";}
        
    if (($hour >= 10) && ($hour <= 22 )) {    #Küche Licht, Kaffee
        my $debug = `/var/www/sprachansage/./aussentemp.sh && /var/www/sprachansage/./vorhersage.sh && /var/www/sprachansage/./wohntemp.sh && amixer -D $sound_device set $alsa_chanel $volumestep%- && mpg123 -a mixing /tmp/hallo.mp3 /tmp/aktuelleaussentemp.mp3 /tmp/vorhersage.mp3 /tmp/wohnzimmer.mp3 && amixer -D $sound_device set $alsa_chanel $volumestep%+`;
        return "Ansage";
    }
    
    
    if ($msg{'dst'} eq ($kaffee or $kueche_licht)) { 
    
    if ($msg{'value'} == 0) {   
            my $debug = `/var/www/sprachansage/./aussentemp.sh && /var/www/sprachansage/./vorhersage.sh && /var/www/sprachansage/./wohntemp.sh && amixer -D $sound_device set $alsa_chanel $volumestep%- && mpg123 -a mixing /tmp/hallo.mp3 /tmp/aktuelleaussentemp.mp3 /tmp/vorhersage.mp3 /tmp/wohnzimmer.mp3 && amixer -D $sound_device set $alsa_chanel $volumestep%+`;
            return "Ansage wg Telegram";
        }
        }
    Da ich die Dateien mehr oder weniger on demand aus dem Internet lade, könnte es dieses Script sein, dass die Prozessorlast dauerhaft erhöht?
    Die shell Befehle stehend deshalb in einer Zeile, da es "wichtig" ist, dass sie nacheinander ausgeführt werden. Gibts da noch eine saubere Lösung?
    Die Scripte sind noch "Reste" von linknx, um die aktuellen mp3 Dateien zu erzeugen

    Gruß Volker

    Edit:
    Oh Oh jetzt gehts gar nicht mehr.
    apt-get und der wiregate update im Webmin spucken das aus:
    Code:
    Die folgenden Pakete werden ENTFERNT:
      alsaplayer-common alsaplayer-gtk apache2-mpm-worker apache2-utils
      apache2.2-common avahi-daemon avahi-utils bind9-host binutils
      build-essential collectd cometvisu curl dnsutils dpkg-dev g++ g++-4.3 gcc
      gcc-4.3 gnome-icon-theme gstreamer0.10-pulseaudio hal language-env
      libapache2-mod-proxy-html libaprutil1 libatk1.0-0 libatk1.0-data
      libavahi-client-dev libavahi-glib1 libbind9-40 libbind9-50 libc-bin
      libc-dev-bin libc6-i686 libcanberra-gtk-module libcanberra-gtk0 libcroco3
      libcups2 libcurl3 libcurl3-gnutls libdbus-1-dev libdbus-glib-1-2 libdns45
      libdns58 libgconf2-4 libgconfmm-2.6-1c2 libglade2-0 libglademm-2.4-1c2a
      libglib2.0-0 libglib2.0-dev libglibmm-2.4-1c2a libgsf-1-114 libgssapi-krb5-2
      libgstreamer-plugins-base0.10-0 libgstreamer-plugins-pulse0.10-0
      libgstreamer0.10-0 libgtk2.0-0 libgtk2.0-bin libgtkmm-2.4-1c2a libidl0
      libisccfg40 libisccfg50 libkrb5-3 libkrb53 libmms0 libneon27-gnutls
      libnss-mdns liborbit2 libpango1.0-0 libpangomm-1.4-1 libpq5 libpulse-dev
      libpulse-mainloop-glib0 librrd-cgi-image-perl librrd4 librrdp-perl
      librrds-perl librsvg2-2 librsvg2-common libsplashy1 libstdc++6-4.3-dev
      libsvn-perl libsvn1 linknx locales mc mpd mutt ncmpc nfs-common
      openssh-client openssh-server paman pavucontrol pavumeter php5 php5-cgi
      phpsysinfo pkg-config pulseaudio-module-hal python-rrd python-rrdtool
      python-subversion rrdtool samba samba-common setools shared-mime-info smbfs
      subversion subversion-tools syslog-ng uswsusp webmin-wiregate wg-patch
      wg-rootlock wiregated
    help!

    Edit2: wenn ich das Script auf 2 Scripte aufteile, dann geht es wieder. Wenn ich das Script dann unter einem anderen Namen Speicher (z.B Bad Radio) Den Port und die Sound Device Namen ändere, dann geht das 2.te Script nicht. darf ich namen wie "my IP = " nur einmal in allen Scripten gebrauchen, oder kann ich die jedes mal wieder anders definieren`?

    #2
    Der Reihe nach..
    Zitat von vlamers Beitrag anzeigen
    ich hab mich lange davor gedrückt aber ich versuche meine linknx logiken in Perl zu schreiben.
    ..möchte ich nochmal zart darauf hinweisen, das es keine Logikengine ist. Man kann sicher viel machen aber ab wann das unübersichtlich wird muss jeder selbst entscheiden.

    $plugin_subscribe{$Sonneneinstrahlung, $Aussentemp}{$plugname} = 1;
    Ich weiss nicht ob der Syntax so funktioniert..

    sprintf geht auf 3
    Dann schreib halt %2f rein

    Zum Rest, da sind ein Haufen "syntaktische Feinheiten" drin, das müsste ich Zeilenweise testen aber grundsätzlich: alles was mehr als eine Sekunde dauert/läuft ist in Plugins eine suboptimale Idee!
    Es gibt zwar ein paar Tricks aber das ist alles eher mit Tricks und schweinereien verbunden; daher gleich mal der Vorschlag zur güte, wie ich das hier mit Ansagen mache:
    Es läuft ein Mini-Shellskript das per UDP-Paket die abzuspielenden Ansagen erhält (von WG, HS, Dreambox, ...)

    Code:
    wg1-mm-ebox4300-vdr:~# cat udplistener.sh 
    #!/bin/sh
    WAVDIR=/usr/local/share/wav/
    IFS=","
    
    while [ 1 ]
    do
    echo > /dev/null | nc -q 1 -l -u -p 8006 |
    while read par1 par2 par3 par4 par5 par6 par7 par8 par9
    
    do
        echo received $line p $par1 p $par2 p $par3 p $par4 p $par5 p $par6 p $par7 p  $par8 p $par9
        case "$par1" in
            [[:lower:]]   ) echo "Lowercase letter";;
            [[:upper:]]   ) echo "Uppercase letter";;
            [0-9]         ) echo "Digit";;
            11 ) 
                    # Datatype 11 - simply aplay par2 
                    aplay $WAVDIR$par2.wav
                ;;
            12 ) 
                    # Datatype 12 - TTS 
                    espeak $par2
                ;;
            20 ) 
                    # Datatype 20 - plain cmds
                    #$par2
                    echo "disabled for security"
                ;;
            *             ) 
                    echo "unknown datatype"
                ;;
        esac
    done 
    
    done
    (ist leicht gekürzt)
    Gestartet aus rc.local mit "/usr/local/bin/udplistener.sh &"

    Gesendet wird dann einfach an Port 8006/UDP
    11,Garagentor_offen
    (siehe Plugins CUL,DMX etc.)

    Mit den ganzen &&-Tricks gehts straight in den Wald.. Dann gibts Zombies und andere Überraschungen, schreib die Aufrufe doch einfach untereinander, die werden auch so nacheinander ausgeführt..

    darf ich namen wie "my IP = " nur einmal
    my ... ist nur im lokalen Kontext gültig und überschreibt ggfs. sogar vererbte Variablen, darf man also durchaus mehrfach in mehreren Plugins gleich nennen..

    Makki
    EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
    -> Bitte KEINE PNs!

    Kommentar


      #3
      Ich wollte eigentlich von den shell scripten weg kommen

      Der Fehler war in dem plugin subscribe wie du richtig vermutet hast.

      Das seltsame ist: Es hat funktioniert (an/aus und lauter/leiser)?? Nur wenn ich dasselbe script nochmal mit anderen GA´s mache geht gar keins der beiden scripte mehr.
      Den Grund dafür würd ich gerne wissen es sollte ja eigentlich nix am Computer zufällig passieren.

      Gruß und Danke

      Edit:

      Was ist den mit dem apt-get dass es massiv aufräumen will in meinem WG?

      was vermutlich dazu beigetragen hat und nicht so gut war:

      ich hab den mpd 0.15.3 auf mpd 0.16 geupdatet. (musste hunderte abhängigkeiten mit updaten), weil nur der 0.16 dynamische Datenbanken für verfügbare / nicht verfügbare Netzwerk speicher hat. Da wollte der 0.15 nicht mehr starten, deshalb das update auf 0.16.
      in der shell bringt mir apt-get keine Fehler, nur in dem Webmin update Menü

      Kommentar


        #4
        Hehe, ich liebe es...

        Hoi

        Hehe der Volker
        Du bist mir ja ein schönes Geschenk.
        Treibst es ja noch wilder als ich.

        Aber das ist eben das Schöne an einer offenen Plattform.
        (Zum Leidwesen derjenigen, die das mit möglichst wenig Aufwand fernwarten müssen/sollen/wollen.)

        Naja ein paar wenige freaks kann man ja vielleicht verkraften.
        Grüsse Bodo
        Fragen gehören ins Forum, und nicht in mein Postfach;
        EibPC-Fan; Wiregate-Fan; Timberwolf-Fan mit 30x 1-Wire Sensoren;

        Kommentar


          #5
          Ja und ich muss sagen dass WG (und der Support) verzeihen schon sehr viele Fehler. aber die sind ja keine böse absicht nur try&error ohne dabei 100%ig zu wissen was alles mit dran hängt.
          Zum Glück is nix kaputt gegangen

          Gruß

          Kommentar


            #6
            Ja genau, bin auf Deiner Seite
            Grüsse Bodo
            Fragen gehören ins Forum, und nicht in mein Postfach;
            EibPC-Fan; Wiregate-Fan; Timberwolf-Fan mit 30x 1-Wire Sensoren;

            Kommentar


              #7
              Zitat von makki Beitrag anzeigen
              ..möchte ich nochmal zart darauf hinweisen, das es keine Logikengine ist. Man kann sicher viel machen aber ab wann das unübersichtlich wird muss jeder selbst entscheiden.
              Hmm schade, nachdem es mit der Visu jetzt besser aussieht als das, was ich auf dem HS gebastelt hatte, hatte ich gehofft auch noch meine paar Logiken aufs WG zu schieben und dann den HS ganz abzuschalten (bzw in die Bucht zu geben)...

              Kommentar


                #8
                Kannst ja linknx nehmen. (/etc/linknx.xml ) funktioniert auch sehr gut bis auf für Spezialitäten wie mpd Lautstärke.

                Gruß

                Kommentar


                  #9
                  Zitat von vlamers Beitrag anzeigen
                  Ich wollte eigentlich von den shell scripten weg kommen
                  Naja, so ein Bash-script ist manchmal eine echt geile Sache: es ist so einfach und übersichtlich

                  Den Grund dafür würd ich gerne wissen es sollte ja eigentlich nix am Computer zufällig passieren.
                  Freiwillige vor die Perls' hash(refs) wirklich verstanden haben.. Das ist magic..

                  Was ist den mit dem apt-get dass es massiv aufräumen will in meinem WG?
                  Ist das immernoch?
                  Sollte leicht aufzulösen sein, ist aber ohne genaue Kenntnis was in der sources.list steht/stand so nicht zu sagen. Den MPD 0.15 hatte ich ja im WG-Repo backportet und da liegt er auch immernoch. Über so nen Backport des nächsten Release kann man ja reden, bei noch wilderen ist man dann aber echt alleine!

                  in der shell bringt mir apt-get keine Fehler, nur in dem Webmin update Menü
                  vermutlich hast Du was anderes installiert was garnicht gut war (libc/glibc oder so)

                  Zitat von ctr Beitrag anzeigen
                  Hmm schade, nachdem es mit der Visu jetzt besser aussieht als das, was ich auf dem HS gebastelt hatte, hatte ich gehofft auch noch meine paar Logiken aufs WG zu schieben und dann den HS ganz abzuschalten (bzw in die Bucht zu geben)...
                  Da wollen wir alle hin Sind es aber "nicht ganz"

                  Makki
                  EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                  -> Bitte KEINE PNs!

                  Kommentar


                    #10
                    Jo libc6 wollte der mpd 0.16 sonst läuft der nicht. Was macht das libc6?
                    Ich hab nur das wiregate repo und das debian_multimedia repo drin.

                    Da die benötigten Pakete aber nicht per apt-get zu bekommen waren hab ich sie von der debian package HP runter geladen und per dpkg -i installiert (libc6 und mpd 0.16)
                    Was hat mir das libc verunstaltet? eigentlich funktioniert noch alles einwandfrei.
                    Nur im WG Webmin Menü das update nicht. Da will er 117 Pakete deinstallieren.

                    In der shell sagt er:

                    Code:
                    Paketlisten werden gelesen... Fertig
                    Abhängigkeitsbaum wird aufgebaut
                    Lese Status-Informationen ein... Fertig
                    0 aktualisiert, 0 neu installiert, 0 zu entfernen und 3 nicht aktualisiert.
                    mehr nicht....?
                    Was ist im Update vom Webmin Menü anders? Und wie kann ich das so lassen wie das ist und nur bestehende upgraden wenn was verfügbar sein sollte (WG Patch oder so).

                    Bei den Perl verstehern stell ich mich mal gaaaaannnnzzz hinten an und gehe sicherheitshalber noch ein paar Schritte zurück

                    Gruß

                    Kommentar


                      #11
                      Ja, die libc ist so ungefähr der worstest case.. Die macht alles, also so 98%.
                      Die Dependency ist vermutlich nichtmal notwendig aber steht da halt drin,
                      weil Du Pakete der Distro 2 Versionen weiter wolltest.
                      Entweder das alles schön downgraden oder Wartungs-VPN, ich hab da Erfahrung weil so nen kardinalfehler hab ich auch schon 10x gemacht - und dazugelernt

                      Makki
                      EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                      -> Bitte KEINE PNs!

                      Kommentar


                        #12
                        OK Danke
                        WartungsVPN ist an, und PN unterwegs.

                        Gruß

                        Edit:
                        Ich glaub das libc6 hab ich per apt-get installiert. das libao4 musste ich per dpkg installieren.

                        Kommentar


                          #13
                          Hauptproblem: das Debian lenny (5.0) repo war auskommentiert und das für squeeze wohl mal kurz drin.. Nicht gut.. Dist-upgrade entweder komplett durchziehen (Mega-unsupprted!) oder lassen aber nicht der Kiste ihre Distro-Basis nehmen
                          -> Ich hab das jetzt nur wieder eingefügt und nichts downgegraded (spielt ansich wenig Rolle, es könnte nur bei zukünftigen updates wieder knatschen) schon ist apt zufrieden..
                          Generell ist Debian ja sehr nett, man darf auch viel mischen aber nicht immer und alles.
                          Die neuere libc6 macht ja nix kaputt aber die depends bekommen halt Blut&Puls + Herzrasen..

                          Makki
                          EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                          -> Bitte KEINE PNs!

                          Kommentar

                          Lädt...
                          X