Ankündigung

Einklappen
Keine Ankündigung bisher.

Mit Rule Bild von Webseite grabben

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

    Mit Rule Bild von Webseite grabben

    Hallo,

    gibt es die Möglichkeit über eine Rule ein Bild von einer Webseite zu holen.

    Wenn es klingelt möchte ich das aktuelle Bild von einer Webcam über Pushover verschicken, dazu muss es ja local vorliegen. Hat jemand eine Idee wie man das am besten über Openhab bewerkstelligt ?
    - openHAB 3.4.4 auf WIN11/64

    #2
    Habe ich rein zufällig... Funktioniert für eine Instar 7011HD:

    Code:
    rule "Es klingelt"
    when
        Item Klingel changed to ON
    then
        // Kamera drehen
        CameraPresets.sendCommand(2)
        Thread::sleep(13000)
        val url = "http://<user>:<passwort>@<ip>/tmpfs/snap.jpg"
        val outputfile = "/tmp/" + now.toString("HH-mm_dd-MM-yyyy") + ".jpg"
        var cmd = "wget -O " + outputfile + " " + url
        executeCommandLine(cmd, 5000)
        sendMail("<mail>", "Es hat am " + now.toString("dd.MM.yyyy HH:mm") + " Uhr an der Tür geklingelt", "", "file://"+outputfile)
        Thread::sleep(15000)
    
        // zurückdrehen
        CameraPresets.sendCommand(0)
    end

    Kommentar


      #3
      Ja, aber bitte Thread::sleep() grundsätzlich nicht mit Werten über 500 verwenden. openHAB nutzt einen Threadpool, um Rules auszuführen. Thread::sleep() legt den Thread, der die Rule gerade ausführt schlafen, er steht somit nicht zur Verfügung. Hinzu kommt, dass z.B. die obige Rule durchaus mehrfach getriggert werden kann. Ein Gast klingelt sturm (10 mal hintereinander innerhalb 10 Sekunden), dann läuft es so, dass die Rule 10 mal getriggert wird. Allerdings wird sie nur fünfmal gestartet, denn danach ist der Threadpool aufgebraucht.
      Nachdem die Rule nach 13 Sekunden das Bild schickt, wartet sie weitere 15 Sekunden, also insgesamt 27 Sekunden. (allerdings werden in der Zeit weitere 4 Bilder gemacht und versendet, eben jede Sekunde eines) und nach dieser Zeit (wir reden von den 27 Sekunden) startet die Rule ein sechstes bis zehntes Mal, jeweils im Abstand der ersten 5 Rules. Kann natürlich sein, dass die Kamera das nicht mit macht, aber das soll uns mal egal sein (ganz ab davon, dass es vielleicht noch Zugriffsfehler gibt, weil diverse Dateien schon vorhanden sind).

      Korrekt sieht so eine Rule so aus:
      Code:
      // Globale Variablen immer zu Beginn der Datei definieren!
      
      var Timer tKlingel = null
      var Number nStep
      
      rule "Es klingelt"
      when
          Item Klingel changed to ON // besser received command ON als Trigger verwenden, falls möglich
      then
          if(tKlingel !== null) return;  // es wurde bereits geklingelt; Abbruch!
      
          CameraPresets.sendCommand(2)     // Kamera drehen
          nStep = 0
          tKlingel = createTimer(now.plusSeconds(13), [ |
              nStep += 1                                             // alternativ nStep = nStep + 1
              switch (nStep) {
                  case 1 : {
                      val url = "http://<user>:<passwort>@<ip>/tmpfs/snap.jpg"
                      val outputfile = "/tmp/" + now.toString("HH-mm_dd-MM-yyyy") + ".jpg"
                      var cmd = "wget -O " + outputfile + " " + url
                      executeCommandLine(cmd, 5000)
                      sendMail("<mail>", "Es hat am " + now.toString("dd.MM.yyyy HH:mm") + " Uhr an der Tür geklingelt", "", "file://"+outputfile)
      
                                                   // eventuell schon hier zurück drehen?
      
                      tKlingel.reschedule(now.plusSeconds(15)
                  }
                  case 2 : {
                      CameraPresets.sendCommand(0)                      // zurück drehen
                      tKlingel = null                                         // Timer zurücksetzen
                  }
              }
          ]
      end
      Vermutlich willst Du die Kamera zuerst zurück drehen, und dann die Pause einlegen. Egal, jedenfalls erledigt diese Rule die Aufgabe genauso, mit dem Unterschied, dass sie zum einen aktiv verhindert, dass der relevante Code mehrfach ausgeführt wird, und zum anderen kein Thread belegt bleibt, nur weil gerade jemand geklingelt hat.

      Kommentar


        #4
        Danke , das teste ich gleich mal, da habe ich wohl zu kompliziert gedacht
        - openHAB 3.4.4 auf WIN11/64

        Kommentar


          #5
          Zitat von BEL166299961 Beitrag anzeigen
          Code:
          val url = "http://<user>:<passwort>@<ip>/tmpfs/snap.jpg"
          val outputfile = "/tmp/" + now.toString("HH-mm_dd-MM-yyyy") + ".jpg"
          var cmd = "wget -O " + outputfile + " " + url
          executeCommandLine(cmd, 5000)
          sendMail("<mail>", "Es hat am " + now.toString("dd.MM.yyyy HH:mm") + " Uhr an der Tür geklingelt", "", "file://"+outputfile)
          Das externe ausführen von wget müsste man hier auch weglassen können. SendMail unterstützt das direkte Senden von Anhängen die per URL verfügbar sind ;-)

          Kommentar

          Lädt...
          X