Ankündigung

Einklappen
Keine Ankündigung bisher.

EDOMI - LBS - Diskussion

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • coliflower
    antwortet
    Könnte das funktionieren ?

    PHP-Code:
    $anzahl count $names);
    for (
    $x 0$x $anzahl$x++)
        
    setLogicLinkAusgang($id,1,$names[$x]); 

    Einen Kommentar schreiben:


  • coliflower
    antwortet
    OK, ich werde mal zuhause TRIAL/ERROR spielen ;-)
    DANKE mal :-)

    Einen Kommentar schreiben:


  • wintermute
    antwortet
    Zitat von coliflower Beitrag anzeigen
    Na ja, eigentlich sollte es nur einen Ausgang geben, WENN es möglich ist ... der auf ein KO schreibt.
    Vielleicht mit einer FOR-Schleife die das Array durchgeht mit Pause zwischen jedem Druchlauf ?
    Im LBS Teil geht das definitiv nicht (da werden die Ausgaenge nur einmalig am Ende gesetzt, vorherige Werte gehen also verloren, es bleibt nur der letzte uebrig), im EXEC muesste es (nach meinem Verstaendnis) wegen der Asynchronitaet hinhauen, hab ich aber selber noch nicht ausprobiert...

    Einen Kommentar schreiben:


  • coliflower
    antwortet
    Zitat von wintermute Beitrag anzeigen
    Ich taets so machen:
    Ich werde mir das zuhause anschauen ...

    Zitat von wintermute Beitrag anzeigen
    Einfach mit
    PHP-Code:
    setLogicLinkAusgang($id,1,$names[0]); 

    Zitat von wintermute Beitrag anzeigen
    Das Problem ist eher irgendwie die Namen fest den Ausgaengen zuzuordnen, denke ich...
    Na ja, eigentlich sollte es nur einen Ausgang geben, WENN es möglich ist ... der auf ein KO schreibt.
    Vielleicht mit einer FOR-Schleife die das Array durchgeht mit Pause zwischen jedem Druchlauf ?

    Einen Kommentar schreiben:


  • wintermute
    antwortet
    Zitat von coliflower Beitrag anzeigen
    a. wäre das so ein Code (bin derzeit nicht zuhause um zu testen ...) ?
    Ich taets so machen:
    PHP-Code:
    $devices=json_decode($json,true);
    $names=array();
    foreach (
    $devices['devices'] as $device) {
            if (
    array_key_exists('name',$device)) $names[]=$device['name'];

    Am Ende ist $names ein Array, in dem in der JSON Eingangsreihenfolge alle Namen, liegen, also hier konkret:
    PHP-Code:
    Array
    (
        [
    0] => Computer
        
    [1] => ATV


    Zitat von coliflower Beitrag anzeigen
    b. wie könnte man via PHP jetzt die Einzelergebnise (Computer, ATV, ...) an eine KO á la Temperatur senden um diese in einem Archiv zu speichern ?
    Einfach mit
    PHP-Code:
    setLogicLinkAusgang($id,1,$names[0]); 
    Das Problem ist eher irgendwie die Namen fest den Ausgaengen zuzuordnen, denke ich...

    gruesse :: Michael

    Einen Kommentar schreiben:


  • coliflower
    antwortet
    Hallo Michael,

    wenn man jetzt eine JSON "umgekehrt" auslesen möchte - um eine Art Liste zu haben, z.B. liste mir alle Namen auf die unter 'name' zu finden sind ... ist das auch möglich ?


    a. wäre das so ein Code (bin derzeit nicht zuhause um zu testen ...) ?
    b. wie könnte man via PHP jetzt die Einzelergebnise (Computer, ATV, ...) an eine KO á la Temperatur senden um diese in einem Archiv zu speichern ?

    PHP-Code:
    foreach ($json AS $key => $name) {
        if ( 
    $key == 'name') {
        
    setLogicLinkAusgang($id,1,$name['name']);
        }


    oder so:
    PHP-Code:
    foreach ($json AS $key => $name) {
        if ( 
    $key -> name == 'name') {
        
    setLogicLinkAusgang($id,1,$name['name']);
        }


    JSON:
    PHP-Code:
    {
      
    "devices" : [
        {
          
    "active" false,
          
    "available" true,
          
    "network address" "",
          
    "protected" false,
          
    "selected" true,
          
    "supports audio" true,
          
    "sound volume" 24,
          
    "kind" "computer",
          
    "name" "Computer",
          
    "supports video" true
        
    },
        {
          
    "active" false,
          
    "available" true,
          
    "network address" "28:cf:da:2a:a5:35",
          
    "protected" false,
          
    "selected" false,
          
    "supports audio" true,
          
    "sound volume" 24,
          
    "kind" "apple tv",
          
    "name" "ATV",
          
    "supports video" true
        
    }
      ]

    Zuletzt geändert von coliflower; 16.03.2016, 12:03.

    Einen Kommentar schreiben:


  • coliflower
    antwortet
    Nochmals Danke, werde ich testen :-)

    Vorläufiges Ergebnis:

    Bildschirmfoto 2016-03-15 um 00.17.49.png

    Einen Kommentar schreiben:


  • wintermute
    antwortet
    Zitat von coliflower Beitrag anzeigen
    DANKE
    buedde... hier nochmal in "sicherer":
    PHP-Code:
    $j=json_decode($json,TRUE);
    $s="Computer";
    $found=FALSE;
    foreach (
    $j['devices'] as $device) {
      if (
    $device['name']==$s) {
        
    $found=TRUE;
        break;
      }
    }
    if (
    $found) {
      
    setLogicLinkAusgang($id,1,$device['name']);
      
    setLogicLinkAusgang($id,2,$device['selected']);
      
    setLogicLinkAusgang($id,3,$device['sound volume']);
    } else {
      
    writeToTraceLog(0,true,"Device $s nicht gefunden");

    Einen Kommentar schreiben:


  • coliflower
    antwortet
    DANKE

    Jetzt muss ich’s noch ein wenig verdauen damit’s besser „sitzt“

    Einen Kommentar schreiben:


  • wintermute
    antwortet
    Zitat von coliflower Beitrag anzeigen
    Was bewirkt das „Break“ ?
    Es beendet die foreach Schleife. Das spart nicht nur unnoetige Durchlaeufe, in meiner Version bewirkt es auch, dass am Ende in $device der betreffende Teil des JSON Arrays liegt.

    Zitat von coliflower Beitrag anzeigen
    Ist es auch möglich, wenn ‚Computer‘ gefunden wurde mir auch die dazugehörigen Wert „selected“ und „sound volume“ an die anderen Ausgänge auszugeben ?
    Klar, wie beschrieben. Hier nochmal in PHP:
    PHP-Code:
    $j=json_decode($json,TRUE);
    $s="Computer";
    foreach (
    $j['devices'] as $device) {
      if (
    $device['name']==$s) {
        
    setLogicLinkAusgang($id,1,$device['name']);
        
    setLogicLinkAusgang($id,2,$device['selected']);
        
    setLogicLinkAusgang($id,3,$device['sound volume']);
        break;
      }

    Einen Kommentar schreiben:


  • coliflower
    antwortet
    Ich habe bis jetzt folgendes „zusammengebracht“:

    PHP-Code:
            if ($E[1]['refresh']) {
                
                foreach (
    $airplays['devices'] as $p) {
                    if (
    $p['name'] == $E[3]['value']) {
                        
    setLogicLinkAusgang($id,3,1);
                    }
                }            
            } 

    Das sieht fast gleich aus wie dein Beispiel (DANKE) …
    Was bewirkt das „Break“ ?

    Ist es auch möglich, wenn ‚Computer‘ gefunden wurde mir auch die dazugehörigen Wert „selected“ und „sound volume“ an die anderen Ausgänge auszugeben ?

    Nochmals danke !!

    Einen Kommentar schreiben:


  • wintermute
    antwortet
    Zitat von coliflower Beitrag anzeigen
    wintermutevielleicht ersparst du mir vieeeele Stunden des Probierens :-) ?
    Ma sehn

    Der Schnipsel hier ist weder getestet, noch wird er so sauber laufen, aber als Anhaltspunkt sollte er reichen:
    PHP-Code:
    $j=json_decode($json,TRUE);
    $s="Computer";
    foreach (
    $j['devices'] as $device) {
        if (
    $device['name']==$s) break;

    $j ist dein JSON-String, $s ist der Name den Du suchst (also Deine beiden Eingaenge), am Ende liegt in $device das Array, auf das das Suchmuster passt. In $device['sound volume'] also zB die Lautstaerke.
    Wird nix gefunden, liegt am Ende in $device dann nicht das gefundene Device (mehr oder minder logischerweise ), sondern das lezte im JSON. Das musste noch entsprechend abfangen, war ich jetzt zu faul zu

    HTH :: Michael

    Einen Kommentar schreiben:


  • coliflower
    antwortet
    wintermute

    Hallo Michael,

    vielleicht ersparst du mir vieeeele Stunden des Probierens :-) ?

    Ich habe eine JSON mit Array (das erste Mal ;-)
    Die „standard“ JSON ist mittlerweile kein Problem aber mit dem Array ...

    Hier der Code - was ich tun möchte:

    An einem Eingang des LBS liegt der JSON-String ($json) an, am zweiten gebe ich z.B. den Namen ein „Computeroder „ATV“ oder … D.h., für jeden AirPlayLautsprecher ein LBS ...

    Jetzt soll der LBS den String nach Computer „durchsuchen“ und hier die drei Werte am Ausgang zurückgeben:
    ‚name‘
    ‚selected‘
    ‚sound volume'

    PHP-Code:
    <?php

    function LB_LBSID($id) {
        
        if (
    $E=getLogicEingangDataAll($id)) {
        
            
    $json '{"devices" : [{"selected" : true, "sound volume" : 24, "name" : "Computer"},{"selected" : false,"sound volume" : 24,"name" : "ATV"}]}'

            
    $airplays json_decode($json,true);

            if (
    $E[1]['refresh']) {
                
                if (
    array_key_exists('name',$airplays)) {
                    
    setLogicLinkAusgang($id,3,$airplays['name']);
                }
            }
        }
    }

    ?>
    DANKE !!




    EDIT: hier das original JSON ..
    PHP-Code:
    {
      
    "devices" : [
        {
          
    "active" false,
          
    "available" true,
          
    "network address" "",
          
    "protected" false,
          
    "selected" true,
          
    "supports audio" true,
          
    "sound volume" 24,
          
    "kind" "computer",
          
    "name" "Computer",
          
    "supports video" true
        
    },
        {
          
    "active" false,
          
    "available" true,
          
    "network address" "28:cf:da:2a:a5:35",
          
    "protected" false,
          
    "selected" false,
          
    "supports audio" true,
          
    "sound volume" 24,
          
    "kind" "apple tv",
          
    "name" "ATV",
          
    "supports video" true
        
    }
      ]

    Einen Kommentar schreiben:


  • coliflower
    antwortet
    OK, danke !!
    Ich versuche gerade weg von http zum „Upload“ der Dateien in ein Edomi-Share … In einem anderem Thread ...

    Einen Kommentar schreiben:


  • wintermute
    antwortet
    Zitat von coliflower Beitrag anzeigen
    Hättest du eine Idee wie man so etwas abfangen kann ?
    Meinst Du die Fehlermeldung im Error-Log?, Ja, haette ich... mein hostcheck LBS macht das zB.
    Allerdings musst Du Dich dann allein um das Loggen von Fehlern kuemmern - also von Meldungen die eigentlich ins Edomi-Errorlog gehoeren. Ich taete das in Deinem Fall eigentlich nicht empfehlen...

    gruesse :: Michael

    Einen Kommentar schreiben:

Lädt...
X