Page 1 of 4

Fritz!Box Plugin

Posted: Wed Feb 11, 2009 10:03 pm
by TANE
Ik heb lang zitten zoeken maar kon geen plugin vinden voor Homeseer.
Enige optie die overblijft is dan maar zelf een te bouwen.

Wie heeft er belangstelling en of interesse om gezamenlijk een plugin te bouwen?

Fritz!Box Plugin

Posted: Thu Feb 12, 2009 7:40 am
by flexer
Ik heb zeer zeker belangstelling voor een Fritz!Box plugin. Zie mijn eerdere berichten op dit forum. Alleen weet ik niet of ik de tijd heb om aktief te bouwen....

Fritz!Box Plugin

Posted: Fri Feb 13, 2009 7:22 am
by flexer
Eerdere discussie over call monitoring op de Fritz!Box is hier te vinden:

http://www.domoticaforum.eu/topic.asp?TOPIC_ID=209

Fritz!Box Plugin

Posted: Fri Feb 13, 2009 12:15 pm
by RDNZL
Volgens mij is de layout van de call string op de telnet poort veranderd sinds de upgrade.

DomotiGa geeft een parse error bij binnenkomende calls, moet dit nog even onderzoeken/fixen.

Regards,
Ron.

Fritz!Box Plugin

Posted: Fri Feb 13, 2009 12:36 pm
by TANE
Ron,
Is het mogelijk dat ik een deel van je source kan ontvangen (na de aanpassingen).
Ik wil dan kijken of ik deze kan ombouwen naar een plugin.

gr
Enver

Fritz!Box Plugin

Posted: Fri Feb 13, 2009 1:08 pm
by RDNZL
Ja tuurlijk, al mijn code staat op domotiga.nl, maar de frixzbox code is daar nog niet helemaal uptodate, dus hierbij.

Opmerkingen, ik gebruik de mysql table layout van asterisk cdr, en de onderstaande code werkt niet goed met de laatste update dus, ik moet wat aan die Scan() routines aanpassen vermoed ik.
Tis allemaal zeer beta, maar deed was het moest doen.

Code: Select all

' Gambas class file

' Description:
' FritzBox.class
' Provide support for Fritz!Box call monitoring. (via call log port)

' Development Status:
' Just started to build this one.
' Incoming call detection and Voicebox status implemented.
' Tested with Fritz!Box 7170 Annex A running Firmware 58.x.57

' DomotiGa - an open source home automation program.
' Copyright(C) 2008 Ron Klinkien

' Read file called COPYING for license details.

PROPERTY TCPHost AS String
PROPERTY FritzBoxDebug AS Boolean

PRIVATE sTCPHost AS String
PRIVATE bFritzBoxDebug AS Boolean

PUBLIC hFritzBox AS NEW Socket

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' connect to the host:port
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PUBLIC FUNCTION Connect() AS Boolean

  ' try to close the connection
  TRY hFritzBox.Close

  ' get a new one
  hFritzBox = NEW Socket AS "FritzBox"
  hFritzBox.Connect(sTCPHost, 1012)

  ' all ok
  RETURN TRUE

CATCH ' some errors
  Main.WriteLog("Fritz!Box Error: " & ERROR.Text)
  RETURN FALSE

END

PUBLIC SUB FritzBox_Ready()

  Main.WriteLog("Fritz!Box TCP socket connected.")

END

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' disconnect from the host
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PUBLIC FUNCTION Disconnect() AS Boolean

  ' try to close the connection
  TRY hFritzBox.Close
  Main.WriteLog("Fritz!Box TCP socket port close.")

  ' all ok
  RETURN TRUE

CATCH ' some errors
  Main.WriteLog("Fritz!Box Error: " & ERROR.Text)
  RETURN FALSE

END

PRIVATE SUB ParseLine(sStr AS String)

  DIM aScan AS String[]
  DIM rResult AS Result
  DIM iId AS Integer

  ' 20.01.09 20:29:10;RING;0;XXXXXXXXX;;POTS;
  IF InStr(sStr, ";RING;") THEN
    aScan = Scan(sStr, "*;RING;*;*;;*;")
    IF Main.bFritzBoxDebug THEN
       Main.WriteDebugLog("[Fritz!Box] Incoming call from " & aScan[2] & " on line " & aScan[3])
    END IF
    ' write data to cdr table
    Main.hDB.Begin()
    rResult = Main.hDB.Create("cdr")
    rResult!calldate = Now()
    rResult!clid = aScan[2]
    rResult!src = aScan[2]
    rResult!dcontext = "incoming"
    rResult!channel = aScan[3]
    rResult!disposition = "NO ANSWER"
    rResult.Update()
    Main.hDB.Commit()
  END IF
  ' 20.01.09 20:29:19;CONNECT;0;0;XXXXXXXXX;
  IF InStr(sStr, ";CONNECT;") THEN
    aScan = Scan(sStr, "*;CONNECT;*;*;*;")
    IF Main.bFritzBoxDebug THEN
      Main.WriteDebugLog("[Fritz!Box] Call to/from " & aScan[3] & " answered")
    END IF
    rResult = Main.hDB.Exec(Subst("SELECT * FROM cdr WHERE clid = &1 ORDER BY calldate DESC LIMIT 1", aScan[3]))
    IF rResult THEN
      IF rResult.Count THEN
        iId = rResult!id
        rResult = Main.hDB.Exec("UPDATE cdr SET disposition = 'ANSWERED', calldate = &1 WHERE id = &2", Now(), iId)
      END IF
    END IF
  END IF
  ' 20.01.09 20:50:11;DISCONNECT;0;1253;
  IF InStr(sStr, ";DISCONNECT;") THEN
    aScan = Scan(sStr, "*;DISCONNECT;*;*;")
    IF Main.bFritzBoxDebug THEN
      Main.WriteDebugLog("[Fritz!Box] Call duration was " & aScan[2] & " seconds")
    END IF
    rResult = Main.hDB.Exec("SELECT * FROM cdr ORDER BY calldate DESC LIMIT 1")
    IF rResult THEN
      iId = rResult!id
      rResult = Main.hDB.Exec("UPDATE cdr SET duration = &1, billsec = &1 WHERE id = &2", aScan[2], iId)
    END IF
  END IF
  ' 20.01.09 22:28:50;CALL;0;0;;0XXXXXXXXX;POTS;
  IF InStr(sStr, ";CALL;") THEN
    aScan = Scan(sStr, "*;CALL;*;*;*;*;*;")
    IF Main.bFritzBoxDebug THEN
      Main.WriteDebugLog("[Fritz!Box] Outgoing call to " & aScan[4] & " with line " & aScan[5])
    END IF
    ' write data to cdr table
    Main.hDB.Begin()
    rResult = Main.hDB.Create("cdr")
    rResult!calldate = Now()
    rResult!clid = aScan[4]
    rResult!dst = aScan[4]
    rResult!dcontext = "default"
    rResult!channel = aScan[5]
    rResult!disposition = "NO ANSWER"
    rResult.Update()
    Main.hDB.Commit()
  END IF

END

PUBLIC SUB FritzBox_Error()

  ' handle error
  SELECT CASE hFritzBox.Status
    CASE Net.CannotCreateSocket
      Main.WriteLog("Fritz!Box: The system does not allow to create a socket.")
    CASE Net.HostNotFound
      Main.WriteLog("Fritz!Box: Host not found.")
    CASE Net.ConnectionRefused
      Main.WriteLog("Fritz!Box: Unable to connect. Connection refused.")
    CASE Net.CannotRead
      Main.WriteLog("Fritz!Box: Error reading data.")
    CASE Net.CannotWrite
      Main.WriteLog("Fritz!Box: Error writing data.")
  END SELECT

END

PUBLIC SUB FritzBox_Read()

  DIM sData AS String

  IF hFritzBox.Status = Net.Connected THEN
    LINE INPUT #hFritzBox, sData
    IF Main.bFritzBoxDebug THEN Main.WriteDebugLog("[Fritz!Box] " & sData)
    ParseLine(sData)
  END IF

END

' implement properties
PRIVATE FUNCTION TCPHost_Read() AS String

  RETURN sTCPHost

END

PRIVATE SUB TCPHost_Write(Value AS String)

  sTCPHost = Value

END

PRIVATE FUNCTION FritzBoxDebug_Read() AS Boolean

  RETURN bFritzBoxDebug

END

PRIVATE SUB FritzBoxDebug_Write(Value AS Boolean)

  bFritzBoxDebug = Value

END


Fritz!Box Plugin

Posted: Fri Feb 13, 2009 1:26 pm
by Digit
Ron, als je binnenkort last van hijgers krijgt...

Fritz!Box Plugin

Posted: Fri Feb 13, 2009 1:34 pm
by RDNZL
<blockquote id="quote"><font size="1" face="Verdana, Arial, Helvetica" id="quote">quote:<hr height="1" noshade id="quote"><i>Originally posted by Digit</i>
<br />Ron, als je binnenkort last van hijgers krijgt...

Fritz!Box Plugin

Posted: Fri Feb 13, 2009 1:52 pm
by TANE
Thanks..

Fritz!Box Plugin

Posted: Tue Feb 17, 2009 11:27 pm
by TANE
Kan iemand helpen om de code van Ron naar Vbscript te vertalen?

Fritz!Box Plugin

Posted: Wed Feb 18, 2009 12:32 am
by Digit
Enver, waarom in VBScript?

Fritz!Box Plugin

Posted: Wed Feb 18, 2009 12:39 am
by TANE
VBscript kan ik via Homeseer aanroepen.

Het lijkt veel op VBscript..

Fritz!Box Plugin

Posted: Wed Feb 18, 2009 1:04 am
by Digit
Ik denk dat je beter kunt gaan voor een 'echte' plugin. Wat is dat bij Homeseer, een dll die geladen wordt door HS? en zich zo nestelt in HS? Want als je bovenstaande in een VBScript zou moeten verpakken dan krijg je volgens mij een VBScript die eeuwig runt, want je moet nl. eeuwig een verbinding met de Fritz in stand houden. Kan dat wel? Ik vraag het me af.

Fritz!Box Plugin

Posted: Wed Feb 18, 2009 10:41 am
by TANE
Idee is om de eerste periode script 1 keer per 10 min te gaan draaien.
tot dat er een plugin is.

Fritz!Box Plugin

Posted: Wed Feb 18, 2009 4:00 pm
by Digit
Enver, als het VBScript niet actief is, is er geen verbinding met de Fritz en zul je berichten gaan missen, want vzv ik weet wordt er niks gebufferd door de Fritz. Dus: script niet actief = berichten missen.