Ankündigung

Einklappen
Keine Ankündigung bisher.

Eingang am LBS zurücksetzen

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

    Eingang am LBS zurücksetzen

    Hallo,

    ich versuche mich gerade an der Entwicklung meines ersten LBS. Dieser soll dazu dienen meinen Landroid Mährobotor auszulesen und um ihn zu starten bzw. zu stoppen. Mein Modell ist von 2017, somit ein älteres und ich kann, falls ich es richtig verstanden habe, die Landroid Bridge nicht nutzen.

    Auslesen der Werte funktioniert, ich triggere hierfür den LBS am Eingang 1 minütlich.
    Am Eingang 2 bzw. 3 möchte ich über eine 1 den Landroid starten oder stoppen.
    Dies funktioniert soweit auch aber ich habe das Problem, dass die Eingänge, sobald ich sie mal mit 1 beschrieben habe ja auf diesem Wert bleiben. Sobald jetzt der minütliche Trigger kommt wird der Baustein wieder durchlaufen, es wird geprüft ob Eingang 2 bzw. 3 auf 1 steht und der Befehl wird gesendet. Sprich ich bin jetzt gerade in einer Schleife. Mein Landroid fährt los, bekommt den Stop-Befehl, bekommt wieder den Move-Befehl usw.

    Wie kann ich in meinem LBS den Eingang wieder zurücksetzen? Bzw. wie kann das besser anstellen?

    Ich habe den LBS mal angehängt. Wie gesagt, ist mein erster und auch nur eine erste schnelle Version von heute nachmittag.

    Vielen Dank
    Marcus

    PHP-Code:
    <??>// @formatter:off
    ###[DEF]###
    [name        = Landroid Automower v0.1 ]

    [e#1            = Trigger ]
    [e#2 trigger    = Start ]
    [e#3 trigger    = Stop ]
    [e#4        = IP ]
    [e#5        = User #init=admin]
    [e#6        = PIN #init=0000]
    [e#7        = Log level #init=8 ]

    [a#1        = Status]
    [a#2        = Batterie %]
    [a#3        = Batterie Ladezustand]
    [a#4        = Firmware Version]

    [v#100        = 0.1 ]
    [v#101        = 19000999 ]
    [v#102        = Landroid Automower]
    [v#103        = 0 ]

    ###[/DEF]###


    ###[HELP]###

    Changelog:
    ==========
    v0.1: Initial version

    ###[/HELP]###
    // @formatter:on
    ###[LBS]###
    <?php
    function LB_LBSID($id) {
        if (
    $E=getLogicEingangDataAll($id))
        {
            
    setLogicElementVar($id,103,$E[7]['value']); //set loglevel to #VAR 103
            
    if ($E[1]['refresh']==|| $E[2]['refresh']== || $E[3]['refresh']==1)
            {            
                
    callLogicFunctionExec(LBSID,$id);
            }
        }
    }
    ?>
    ###[/LBS]###

    ###[EXEC]###
    <?

    define("LB_LBSID_STATE", 1);
    define("LB_LBSID_BATTERYPERC", 2);
    define("LB_LBSID_BATTERYCHARGERSTATE", 3);
    define("LB_LBSID_FIRMWAREVERSION", 4);

    require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
    set_time_limit(3);    //Script soll maximal 60 Sekunden laufen
    sql_connect();

    function logging($id,$msg, $var=NULL, $priority=8)
    {
        $E=getLogicEingangDataAll($id);
        $logLevel = getLogicElementVar($id,103);
        if (is_int($priority) && $priority<=$logLevel && $priority>0)
        {
            $logLevelNames = array('none','emerg','alert','crit','err','warning','notice','info','debug');
            $version = getLogicElementVar($id,100);
            $lbsNo = getLogicElementVar($id,101);
            $logName = getLogicElementVar($id,102) . '  ---  LBS'.$lbsNo;
            strpos($_SERVER['SCRIPT_NAME'],$lbsNo) ? $scriptname='EXE'.$lbsNo : $scriptname = 'LBS'.$lbsNo;
            writeToCustomLog($logName,str_pad($logLevelNames[$logLevel],7), $scriptname." [v$version]:\t".$msg);
            if (is_object($var)) $var = get_object_vars($var);    // transfer object into array
            if (is_array($var))                                    // print out array
            {
                writeToCustomLog($logName,str_pad($logLevelNames[$logLevel],7), $scriptname." [v$version]:\t================ ARRAY/OBJECT START ================");
                foreach ($var as $index => $line)
                    writeToCustomLog($logName,str_pad($logLevelNames[$logLevel],7), $scriptname." [v$version]:\t".$index." => ".$line);
                    writeToCustomLog($logName,str_pad($logLevelNames[$logLevel],7), $scriptname." [v$version]:\t================ ARRAY/OBJECT  END  ================");
            }
        }
    }

    function getValue($valueString, $searchString)
    {
        $startPos = strpos($valueString, $searchString) + strlen($searchString);
        $endPos = strpos($valueString, ',', $startPos)-1;
        $value = substr($valueString, $startPos, $endPos-$startPos);
        return $value;
    }


    if ($E=logic_getInputs($id)) {
        logging($id,"LBS started");
        
        $ip = $E[4]['value'];
        $user = $E[5]['value'];  
        $pin = $E[6]['value'];
        
        $format = 'http://%s:%d@%s/jsondata.cgi';
        $url = sprintf($format, $user, $pin, $ip);

        if($E[1]['value'] == 1)
        {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
            
            $data = curl_exec($ch);
            
            // state
            $stateSearchString = '"state":"';
            $stateValue = getValue($data, $stateSearchString);
            logging($id, "State: ". $stateValue, NULL, 8);
            logic_setOutput( $id, LB_LBSID_STATE, $stateValue );
            
            // perc_batt
            $battPercSearchString = '"perc_batt":"';
            $battPercValue = getValue($data, $battPercSearchString);
            logging($id, "perc_batt: ". $battPercValue, NULL, 8);
            logic_setOutput( $id, LB_LBSID_BATTERYPERC, $battPercValue );
            
            // batteryChargerState
            $batteryChargerStateSearchString = '"batteryChargerState":"';
            $batteryChargerStateValue = getValue($data, $batteryChargerStateSearchString);
            logging($id, "batteryChargerState: ". $batteryChargerStateValue, NULL, 8);
            logic_setOutput( $id, LB_LBSID_BATTERYCHARGERSTATE, $batteryChargerStateValue );
            
            // versione_fw
            $firmwareVersionSearchString = '"versione_fw":"';
            $firmwareVersionValue = getValue($data, $firmwareVersionSearchString);
            logging($id, "versione_fw: ". $firmwareVersionValue, NULL, 8);
            logic_setOutput( $id, LB_LBSID_FIRMWAREVERSION, $firmwareVersionValue );
            
        }
        
        if($E[2]['value'] == 1)
        {
            logging($id, "Start landroid automower");
            $dataArray = array('data' => '[["settaggi",11,1]]');
            
            $jsonData = http_build_query($dataArray);        
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch,CURLOPT_POSTFIELDS, $jsonData);
            
            $result = curl_exec($ch);
        }
        
        if($E[3]['value'] == 1)
        {
            logging($id, "Stop landroid automower");
            $dataArray = array('data' => '[["settaggi",12,1]]');
            
            $jsonData = http_build_query($dataArray);        
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch,CURLOPT_POSTFIELDS, $jsonData);
            
            $result = curl_exec($ch);
        }
        
        logging($id,"LBS stopped");
    }

    sql_disconnect();
    ?>


    ###[/EXEC]###

    #2
    Eingänge müssen nicht zurückgesetzt werden. Edomi ist Ereignis orientiert. Du musst das in deiner Logik abfangen bzw. Einen Daemon LBS bauen (EXEC).

    Kommentar


      #3
      Versuchs Mal damit:

      Code:
      if($E[2]['value'] == 1 && $E[2]['refresh'] == 1)

      Kommentar


        #4
        Falls du deinen Worx auf eine MQTT Firmware upgraden kannst, dann sollte auch der Worx 2019 LBS funktionieren.

        Kommentar


          #5
          Zitat von jonofe Beitrag anzeigen
          Eingänge müssen nicht zurückgesetzt werden. Edomi ist Ereignis orientiert. Du musst das in deiner Logik abfangen bzw. Einen Daemon LBS bauen (EXEC).
          das ist mir klar, das Ereignis ist in diesem Moment ja der Trigger an E1 der minütlich kommt. Trotzdem ist E2 bzw E3 zu diesem Zeitpunkt auf 1. Refresh kann ich im EXEC- Teil ja nicht zuverlässig prüfen.

          Ich brauche die 1 auf E2 bzw. E3 nur kurz um den Befehl abzugeben. Ist dies passiert und er wird dann über E1 wieder neu getriggert sollte eben der Teil zum ausführen der Befehle nicht mehr ausgeführt werden, das kann ich aber aktuell in meiner Logik nicht anfangen.

          Kommentar


            #6
            Doch das kannst du mit logic_setInputQueued() (LBS) und logic_getInputQueued() (EXEC)
            oder aber mit message queues oder shared memory. ist aber seit Existenz der o.g. Funktionen in Edomi nicht mehr nötig.

            Kommentar


              #7
              Hi,

              vielen Dank, werde ich mal ausprobieren.
              Ich kenne aktuell diese Webseite https://www.knx-home.net/wiki/index.php/Logic gibt es noch weitere Quellen?
              Hast du für logic_setInputQueued() ein Beispiel? Ich kenne mich leider bei den LBS noch nicht so gut aus, dass ich da jetzt auf Anhieb einen finden würde.

              Vielen Dank
              Marcus

              Kommentar


                #8
                In der Hilfe gibt es zu den Funktionen ein paar Hinweise und Beispiele ...
                Danke und LG, Dariusz
                GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                Kommentar


                  #9
                  schaust Du hier:

                  PHP-Code:
                  ###[DEF]###
                  [name        =    HP Switch Port send]
                  [titel        =    HP Switch Port send V 0.21]
                  [e#1        trigger =    Trigger]
                  [e#2        important =    IP #init=10.0.0.100]
                  [e#3        important =    Community #init=writesecret]
                  [e#4        trigger =    Port EIN]
                  [e#5        trigger =    Port AUS]
                  [e#6        trigger =    Port POE EIN]
                  [e#7        trigger =    Port POE AUS]
                  [e#8        trigger =    reset]
                  [e#9        optional =    Loglevel #init=0]

                  [a#1        =    change]


                  [v#1 remanent =  ]     // Poe Port
                  [v#2 remanent =  ]    //switchable Ports
                  [v#3           =  ]



                  [v#100        = 0.01 ]                        // Version
                  [v#101        = 19000280 ]                    // LBS ID
                  [v#102        = HP Port schalten]                // LBS name
                  [v#103        = 7 ]                            // Log level
                  [v#104        = 1 ]                            // One logfile per instance
                  [v#105        = 1 ]                            // log ID in each line
                  [v#300 remanent = 0 ]                        // autoinstall

                  ###[/DEF]###


                  ###[HELP]###
                  ###[/HELP]###


                  ###[LBS]###
                  <?
                  function LB_LBSID($id) {
                      if ($E=logic_getInputs($id)) {
                          if($E[8]['refresh'] == 1 || ($E[2]['refresh'] == 1 && logic_getVar($id,3) != $E[2]['value'])){
                              logic_setVar($id,1,'');
                              logic_setVar($id,2,'');
                              if($E[8]['refresh'] == 1){
                                  logic_setVar($id,300,0);
                              }
                          }
                          if(logic_getStateExec($id)==0 && ($E[1]['refresh'] == 1 || $E[2]['refresh'] == 1 || $E[4]['refresh'] == 1 || $E[5]['refresh'] == 1  || $E[6]['refresh'] == 1 || $E[7]['refresh'] == 1 || $E[8]['refresh'] == 1)){
                          logic_setVar($id,3,$E[2]['value']);
                          logic_setInputsQueued($id,$E);
                          callLogicFunctionExec(LBSID,$id,true);
                          }else{
                              logic_setInputsQueued($id,$E);
                          }
                      }
                  }


                  ?>
                  ###[/LBS]###


                  ###[EXEC]###
                  <?
                  require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
                  sql_connect();
                  while (logic_getEdomiState()==1) {
                      if ($E=logic_getInputsQueued($id)) {
                          if(getSysInfo(1)>1){
                              $ip = $E[2]['value'];
                              $pass = $E[3]['value'];
                              snmp_set_quick_print(1);
                              $online = ping($ip);
                              if ($online !=""){
                                  $arr = array();
                                  $port_poe = array();
                                  if (logic_getVar($id,2)=='' ) {
                                      LB_LBSID_logging($id,"cachefile not exist" ,7);
                                      $snmp_var = snmp2_real_walk($ip, $pass, "1.3.6.1.2.1.105.1.1.1.3.1");
                                          if($snmp_var != false){
                                              LB_LBSID_logging($id,"POE detected" ,7);
                                              foreach($snmp_var as $key => $val){
                                                  LB_LBSID_logging($id,"Debug $key" ,8);
                                                  $tmp = explode(".",$key);
                                                  $poe_out = end($tmp);
                                                  $port_poe[$poe_out] = $poe_out;
                                              }
                                              logic_setVar($id,1,serialize($port_poe));
                                          }else{
                                              LB_LBSID_logging($id,"no POE detected" ,7);
                                              $port_poe = array();
                                              logic_setVar($id,1,serialize($port_poe));
                                          }
                                      $snmp_var = snmp2_real_walk($ip, $pass, ".1.3.6.1.2.1.2.2.1.2");
                                          if($snmp_var != false){
                                              foreach($snmp_var as $key => $val){
                                                  //if($val != "NULL0" && strpos($val, 'Vlan') === false){
                                                  if($val != "NULL0" && $val != "Vlan-interface1" ){
                                                      $tmp = explode(".",$key);
                                                      $out = end($tmp);
                                                      LB_LBSID_logging($id,"Port $out $val detected" ,6);
                                                      $port[$out] = $out;
                                                  }
                                              }
                                          }else{
                                              LB_LBSID_logging($id,"incompatible Hardware detected -> Abbruch" ,1);
                                              logic_SetState($id,0);
                                              goto ende;
                                          }
                                      logic_setVar($id,2,serialize($port));
                                      LB_LBSID_logging($id,"cachefile generated" ,7);
                                  }
                                  $cache = unserialize(logic_getVar($id,2));
                                  $cache_poe = unserialize(logic_getVar($id,1));
                                  LB_LBSID_logging($id,"cachefile exists" ,7,$cache);
                                  
                                  if($E[4]['refresh']==1 && array_key_exists ( $E[4]['value'] , $cache )){
                                      #Port ein
                                      $_id = $E[4]['value'];
                                      snmp2_set($ip,$pass,"1.3.6.1.2.1.2.2.1.7.$_id","i","1");
                                      LB_LBSID_logging($id,"Port $_id on" ,6);
                                      
                                  }
                                  if($E[5]['refresh']==1 && array_key_exists ( $E[5]['value'] , $cache )){
                                      #Port aus
                                      $_id = $E[5]['value'];
                                      snmp2_set($ip,$pass,"1.3.6.1.2.1.2.2.1.7.$_id","i","2");
                                      $deb = snmpget($ip,$pass,"1.3.6.1.2.1.2.2.1.7.".$_id);
                                      LB_LBSID_logging($id,"Port $_id off debug: $deb" ,6);
                                      
                                      
                                  }
                                  if($E[6]['refresh']==1 && array_key_exists ( $E[6]['value'] , $cache_poe )){
                                      #POE ein
                                      $_id = $E[6]['value'];
                                      snmp2_set($ip,$pass,"1.3.6.1.2.1.105.1.1.1.3.1.$_id","i","1");
                                      LB_LBSID_logging($id,"Port $_id POE on" ,6);

                                  }
                                  if($E[7]['refresh']==1 && array_key_exists ( $E[7]['value'] , $cache_poe )){
                                      #POE aus
                                      $_id = $E[7]['value'];
                                      snmp2_set($ip,$pass,"1.3.6.1.2.1.105.1.1.1.3.1.$_id","i","2");
                                      LB_LBSID_logging($id,"Port $_id POE off" ,6);
                                  }
                                  
                                              
                              logic_setOutput($id,1,1);                
                              }    else{
                                  LB_LBSID_logging($id,"Device not online",6);
                                  logic_setOutput($id,1,0);
                              }
                          }            
                      }else{
                          goto ende;
                          break;
                      }
                      usleep(1000*100);    //z.B. 10ms warten - wichtig, um die CPU-Last zu begrenzen!
                  }

                  ende:
                  logic_SetState($id,0);
                  sql_disconnect();

                  function LB_LBSID_logging($id, $msg, $priority = 8, $var = NULL){
                      $E = logic_getInputs($id);
                      $logLevel = $E[9]['value'];
                      if (is_int($priority) && $priority <= $logLevel && $priority > 0) {
                          $logLevelNames = array(
                              'none',
                              'emerg',
                              'alert',
                              'crit',
                              'err',
                              'warning',
                              'notice',
                              'info',
                              'debug'
                          );
                          $version = getLogicElementVar($id, 100);
                          $lbsNo = getLogicElementVar($id, 101);
                          $logName = getLogicElementVar($id, 102) . "-LBS$lbsNo";
                          $logName = preg_replace('/ /', '_', $logName);
                          if (logic_getVar($id, 104) == 1)
                              $logName .= "-$id";
                          if (logic_getVar($id, 105) == 1)
                              $msg .= " ($id)";
                          strpos($_SERVER['SCRIPT_NAME'], $lbsNo) ? $scriptname = 'EXE' . $lbsNo : $scriptname = 'LBS' . $lbsNo;
                          writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t" . $msg);
                          if (isset($var)) {
                              writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t================ ARRAY/OBJECT START ================");
                              writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t" . json_encode($var));
                              writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t================ ARRAY/OBJECT  END  ================");
                          }
                      }
                  }
                  function install($p,$id) {
                          if ($p) {
                              $ret = true;
                              exec(escapeshellcmd("rpm --query ".$p." > /dev/null 2>&1"),$output,$retval);
                              if ($retval == 4){
                                    $ret = shell_exec("yum install $p -y");
                                    LB_LBSID_logging($id, "package $p missing", 3);
                                    if (strpos($ret, 'Complete') !== false || strpos($ret, 'Komplett') !== false) {
                                            LB_LBSID_logging($id, "package $p installed", 3);
                                        }else{
                                            LB_LBSID_logging($id, "!!!!!!!!! Error !!!!!!!!! Could not install $p ", 1);
                                            $ret = false;
                                            }
                              } else {
                                   LB_LBSID_logging($id, "package $p already installed", 8);
                              }
                          }
                      return($ret);
                  }
                  function ping($host, $timeout = 3) {
                      /* ICMP ping packet with a pre-calculated checksum */
                      $package = "\x08\x00\x7d\x4b\x00\x00\x00\x00PingHost";
                      $socket  = socket_create(AF_INET, SOCK_RAW, 1);
                      socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => $timeout, 'usec' => 0));
                      socket_connect($socket, $host, null);
                      //$ts = microtime(true);
                      socket_send($socket, $package, strLen($package), 0);
                      if (socket_read($socket, 255)) {
                          //$result = microtime(true) - $ts;
                          $result = "ok";
                      } else {
                          $result = false;
                      }
                      socket_close($socket);
                      return $result;
                  }
                  ?>
                  ###[/EXEC]###

                  Kommentar

                  Lädt...
                  X