Firefly mini/HID

If you have a question or need help, this is the place to be.

Firefly Mini

Postby StevenPr » Sat Jan 20, 2007 12:59 am

I use the Harmony 676 with a Firefly receiver.

The Firefly mini is does not require a driver, it uses a Windows HID. It does require a program to activate a few of the keys, one of which launches a program.

EventGhost doesn't handle it as a remote that I know of. It thinks it's a keyboard but doesn't intercept all the keys, such as the red option button that launches a program. It would be nice to intercept that key to launch a program and let me ditch the firefly mini program.

The Logitech software lists it under Media Center PC then Snapstream Firefly mini if I remember correctly.

Steve
StevenPr
 
Posts: 20
Joined: Sun Oct 08, 2006 1:02 pm

Postby Bitmonster » Sat Jan 20, 2007 1:05 pm

Does EG get the event duration right, when the keypresses come from the remote? (Does the EG icon stay red as long as you press the button?)

Another downside of this HID keyboard emulation might be, that EG will react to the same keys from the normal keyboard. It would be very difficult for EG to distinguish between multiple "keyboards".

I guess the red button is attached as another HID device, maybe as a true remote profile. Maybe it would be possible to get these events through the Windows Raw Input API. But this needs also a lot of coding and I'm currently have no device that I could use for tests.
User avatar
Bitmonster
Site Admin
 
Posts: 2239
Joined: Mon Feb 06, 2006 10:28 pm

Postby StevenPr » Sat Jan 20, 2007 11:13 pm

When I press the red option button the keyboard plugin detects no key press and no red EG icon.

Most of the keys above the arrows including the arrows generate key presses. Most of the keys below the arrows generate no key press. Those include buttons like Play, Pause, Menu.

Steve
StevenPr
 
Posts: 20
Joined: Sun Oct 08, 2006 1:02 pm

Postby Bitmonster » Sun Jan 21, 2007 1:47 pm

@StevenPr
Could you please copy the following code into a PythonScript action and let it execute. It should generate a lengthy output in the logger that I would like to see.

Code: Select all
import win32api
import _winreg

from eg.WinAPI.win32types import *
from eg.WinAPI.Display import dumps

GetRawInputDeviceList = user32.GetRawInputDeviceList
GetRawInputDeviceInfo = user32.GetRawInputDeviceInfoA

RIM_TYPEHID = 2
RIM_TYPEKEYBOARD = 1
RIM_TYPEMOUSE = 0

RIDI_PREPARSEDDATA = 0x20000005
RIDI_DEVICENAME    = 0x20000007
RIDI_DEVICEINFO    = 0x2000000b


class RAWINPUTDEVICELIST(Structure):
    _fields_ = [
        ("hDevice", HANDLE),
        ("dwType", DWORD),
    ]
   

class RID_DEVICE_INFO_MOUSE(Structure):
    _fields_ = [
        ("dwId", DWORD),
        ("dwNumberOfButtons", DWORD),
        ("dwSampleRate", DWORD),
        ("fHasHorizontalWheel", BOOL),
    ]
   

class RID_DEVICE_INFO_KEYBOARD(Structure):
    _fields_ = [
        ("dwType", DWORD),
        ("dwSubType", DWORD),
        ("dwKeyboardMode", DWORD),
        ("dwNumberOfFunctionKeys", DWORD),
        ("dwNumberOfIndicators", DWORD),
        ("dwNumberOfKeysTotal", DWORD),
    ]
   
   
class RID_DEVICE_INFO_HID(Structure):
    _fields_ = [
        ("dwVendorId", DWORD),
        ("dwProductId", DWORD),
        ("dwVersionNumber", DWORD),
        ("usUsagePage", DWORD),
        ("usUsage", DWORD),
    ]
   

class RID_DEVICE_INFO(Structure):
    class _U1(Union):
        _fields_ = [
            ("mouse", RID_DEVICE_INFO_MOUSE),
            ("keyboard", RID_DEVICE_INFO_KEYBOARD),
            ("hid", RID_DEVICE_INFO_HID),
        ]
       
    _fields_ = [
        ("cbSize", DWORD),
        ("dwType", DWORD),
        ("_u1", _U1),
    ]
    _anonymous_ = ("_u1", )



def test():
    puiNumDevices = UINT()
    GetRawInputDeviceList(
        0,
        byref(puiNumDevices),
        sizeof(RAWINPUTDEVICELIST)
    )
    pRawInputDeviceList = (RAWINPUTDEVICELIST * puiNumDevices.value)()
    puiNumDevices.value = sizeof(pRawInputDeviceList)
    num = GetRawInputDeviceList(
        byref(pRawInputDeviceList),
        byref(puiNumDevices),
        sizeof(RAWINPUTDEVICELIST)
    )
    pData = RID_DEVICE_INFO()
    pData.cbSize = sizeof(RID_DEVICE_INFO)
    pcbSize = UINT()
    for i in range(num):
        hDevice = pRawInputDeviceList[i].hDevice
        dwType = pRawInputDeviceList[i].dwType
        print "Device: %d:" % i
        GetRawInputDeviceInfo(
            hDevice,
            RIDI_DEVICENAME,
            0,
            byref(pcbSize)
        )
        buf = create_string_buffer(pcbSize.value + 1)
        GetRawInputDeviceInfo(
            hDevice,
            RIDI_DEVICENAME,
            buf,
            byref(pcbSize)
        )
        print "  DeviceName: %r" % buf.value
        key = "System\\CurrentControlSet\\Enum\\"
        key += buf.raw[4:].split("{", 1)[0].replace("#", "\\")
        hkey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, key)
        value, _ = _winreg.QueryValueEx(hkey, "DeviceDesc")
        mfg, _ = _winreg.QueryValueEx(hkey, "Mfg")
        _winreg.CloseKey(hkey)
        print "  DeviceDesc: %r" % value
        print "  Mfg: %r" % mfg
        pcbSize.value = sizeof(RID_DEVICE_INFO)
        GetRawInputDeviceInfo(
            hDevice,
            RIDI_DEVICEINFO,
            byref(pData),
            byref(pcbSize)
        )
        if dwType == RIM_TYPEMOUSE:
            print "  " + dumps(pData.mouse)
        elif dwType == RIM_TYPEKEYBOARD:
            print "  " + dumps(pData.keyboard)
        elif dwType == RIM_TYPEHID:
            print "  " + dumps(pData.hid)
        else:
            print "  unknown type", dwType
           
test()
User avatar
Bitmonster
Site Admin
 
Posts: 2239
Joined: Mon Feb 06, 2006 10:28 pm

Postby StevenPr » Sun Jan 21, 2007 2:53 pm

I have a PS/2 keyboard & mouse, a Gyration wireless keyboard and mouse and an ATI AIW.

Python Script
Device: 0:
DeviceName: '\\??\\HID#Vid_1233&Pid_e007&MI_01&Col03#8&39e36faf&0&0002#{4d1e55b2-f16f-11cf-88cb-001111000030}'
DeviceDesc: u'HID-compliant consumer control device'
Mfg: u'Microsoft'
RID_DEVICE_INFO_HID(
dwVendorId = 4659L,
dwProductId = 57351L,
dwVersionNumber = 256L,
usUsagePage = 65548L,
usUsage = 0L,
)
Device: 1:
DeviceName: '\\??\\HID#Vid_0c16&Pid_0001&MI_01&Col05#8&3863413a&0&0004#{4d1e55b2-f16f-11cf-88cb-001111000030}'
DeviceDesc: u'HID-compliant device'
Mfg: u'(Standard system devices)'
RID_DEVICE_INFO_HID(
dwVendorId = 3094L,
dwProductId = 1L,
dwVersionNumber = 288L,
usUsagePage = 8978364L,
usUsage = 0L,
)
Device: 2:
DeviceName: '\\??\\HID#Vid_0c16&Pid_0001&MI_01&Col04#8&3863413a&0&0003#{4d1e55b2-f16f-11cf-88cb-001111000030}'
DeviceDesc: u'HID-compliant device'
Mfg: u'(Standard system devices)'
RID_DEVICE_INFO_HID(
dwVendorId = 3094L,
dwProductId = 1L,
dwVersionNumber = 288L,
usUsagePage = 130816L,
usUsage = 0L,
)
Device: 3:
DeviceName: '\\??\\HID#Vid_0c16&Pid_0001&MI_01&Col02#8&3863413a&0&0001#{4d1e55b2-f16f-11cf-88cb-001111000030}'
DeviceDesc: u'HID-compliant consumer control device'
Mfg: u'Microsoft'
RID_DEVICE_INFO_HID(
dwVendorId = 3094L,
dwProductId = 1L,
dwVersionNumber = 288L,
usUsagePage = 65548L,
usUsage = 0L,
)
Device: 4:
DeviceName: '\\??\\HID#Vid_04d8&Pid_beef#7&2f94ea66&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}'
DeviceDesc: u'HID-compliant game controller'
Mfg: u'(Standard system devices)'
RID_DEVICE_INFO_HID(
dwVendorId = 1240L,
dwProductId = 48879L,
dwVersionNumber = 257L,
usUsagePage = 262145L,
usUsage = 0L,
)
Device: 5:
DeviceName: '\\??\\HID#Vid_045e&Pid_0027#7&2c52c561&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}'
DeviceDesc: u'HID-compliant game controller'
Mfg: u'(Standard system devices)'
RID_DEVICE_INFO_HID(
dwVendorId = 1118L,
dwProductId = 39L,
dwVersionNumber = 257L,
usUsagePage = 327681L,
usUsage = 0L,
)
Device: 6:
DeviceName: '\\??\\Root#RDP_KBD#0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}'
DeviceDesc: u'Terminal Server Keyboard Driver'
Mfg: u'(Standard system devices)'
RID_DEVICE_INFO_KEYBOARD(
dwType = 81L,
dwSubType = 0L,
dwKeyboardMode = 1L,
dwNumberOfFunctionKeys = 12L,
dwNumberOfIndicators = 3L,
dwNumberOfKeysTotal = 101L,
)
Device: 7:
DeviceName: '\\??\\HID#Vid_1233&Pid_e007&MI_00#8&2b0fbe81&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}'
DeviceDesc: u'HID Keyboard Device'
Mfg: u'(Standard keyboards)'
RID_DEVICE_INFO_KEYBOARD(
dwType = 81L,
dwSubType = 0L,
dwKeyboardMode = 1L,
dwNumberOfFunctionKeys = 12L,
dwNumberOfIndicators = 3L,
dwNumberOfKeysTotal = 264L,
)
Device: 8:
DeviceName: '\\??\\HID#Vid_0c16&Pid_0001&MI_00#8&209fb4f5&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}'
DeviceDesc: u'HID Keyboard Device'
Mfg: u'(Standard keyboards)'
RID_DEVICE_INFO_KEYBOARD(
dwType = 81L,
dwSubType = 0L,
dwKeyboardMode = 1L,
dwNumberOfFunctionKeys = 12L,
dwNumberOfIndicators = 3L,
dwNumberOfKeysTotal = 110L,
)
Device: 9:
DeviceName: '\\??\\ACPI#PNP0303#3&13c0b0c5&0#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}'
DeviceDesc: u'Standard 101/102-Key or Microsoft Natural PS/2 Keyboard'
Mfg: u'(Standard keyboards)'
RID_DEVICE_INFO_KEYBOARD(
dwType = 4L,
dwSubType = 0L,
dwKeyboardMode = 1L,
dwNumberOfFunctionKeys = 12L,
dwNumberOfIndicators = 3L,
dwNumberOfKeysTotal = 101L,
)
Device: 10:
DeviceName: '\\??\\Root#RDP_MOU#0000#{378de44c-56ef-11d1-bc8c-00a0c91405dd}'
DeviceDesc: u'Terminal Server Mouse Driver'
Mfg: u'(Standard system devices)'
RID_DEVICE_INFO_MOUSE(
dwId = 2L,
dwNumberOfButtons = 2L,
dwSampleRate = 60L,
fHasHorizontalWheel = 0,
)
Device: 11:
DeviceName: '\\??\\HID#Vid_1233&Pid_e007&MI_01&Col01#8&39e36faf&0&0000#{378de44c-56ef-11d1-bc8c-00a0c91405dd}'
DeviceDesc: u'HID-compliant mouse'
Mfg: u'Microsoft'
RID_DEVICE_INFO_MOUSE(
dwId = 256L,
dwNumberOfButtons = 3L,
dwSampleRate = 0L,
fHasHorizontalWheel = 0,
)
Device: 12:
DeviceName: '\\??\\HID#Vid_0c16&Pid_0001&MI_01&Col01#8&3863413a&0&0000#{378de44c-56ef-11d1-bc8c-00a0c91405dd}'
DeviceDesc: u'HID-compliant mouse'
Mfg: u'Microsoft'
RID_DEVICE_INFO_MOUSE(
dwId = 256L,
dwNumberOfButtons = 9L,
dwSampleRate = 0L,
fHasHorizontalWheel = 0,
)
Device: 13:
DeviceName: '\\??\\ACPI#PNP0F13#3&13c0b0c5&0#{378de44c-56ef-11d1-bc8c-00a0c91405dd}'
DeviceDesc: u'PS/2 Compatible Mouse'
Mfg: u'Microsoft'
RID_DEVICE_INFO_MOUSE(
dwId = 32L,
dwNumberOfButtons = 5L,
dwSampleRate = 100L,
fHasHorizontalWheel = 0,
)
StevenPr
 
Posts: 20
Joined: Sun Oct 08, 2006 1:02 pm

Postby Bitmonster » Sun Jan 21, 2007 3:06 pm

Could you please unplug the Firefly mini receiver and do it again?
User avatar
Bitmonster
Site Admin
 
Posts: 2239
Joined: Mon Feb 06, 2006 10:28 pm

Postby StevenPr » Sun Jan 21, 2007 3:13 pm

Device: 0:
DeviceName: '\\??\\HID#Vid_0c16&Pid_0001&MI_01&Col05#8&3863413a&0&0004#{4d1e55b2-f16f-11cf-88cb-001111000030}'
DeviceDesc: u'HID-compliant device'
Mfg: u'(Standard system devices)'
RID_DEVICE_INFO_HID(
dwVendorId = 3094L,
dwProductId = 1L,
dwVersionNumber = 288L,
usUsagePage = 8978364L,
usUsage = 0L,
)
Device: 1:
DeviceName: '\\??\\HID#Vid_0c16&Pid_0001&MI_01&Col04#8&3863413a&0&0003#{4d1e55b2-f16f-11cf-88cb-001111000030}'
DeviceDesc: u'HID-compliant device'
Mfg: u'(Standard system devices)'
RID_DEVICE_INFO_HID(
dwVendorId = 3094L,
dwProductId = 1L,
dwVersionNumber = 288L,
usUsagePage = 130816L,
usUsage = 0L,
)
Device: 2:
DeviceName: '\\??\\HID#Vid_0c16&Pid_0001&MI_01&Col02#8&3863413a&0&0001#{4d1e55b2-f16f-11cf-88cb-001111000030}'
DeviceDesc: u'HID-compliant consumer control device'
Mfg: u'Microsoft'
RID_DEVICE_INFO_HID(
dwVendorId = 3094L,
dwProductId = 1L,
dwVersionNumber = 288L,
usUsagePage = 65548L,
usUsage = 0L,
)
Device: 3:
DeviceName: '\\??\\HID#Vid_04d8&Pid_beef#7&2f94ea66&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}'
DeviceDesc: u'HID-compliant game controller'
Mfg: u'(Standard system devices)'
RID_DEVICE_INFO_HID(
dwVendorId = 1240L,
dwProductId = 48879L,
dwVersionNumber = 257L,
usUsagePage = 262145L,
usUsage = 0L,
)
Device: 4:
DeviceName: '\\??\\HID#Vid_045e&Pid_0027#7&2c52c561&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}'
DeviceDesc: u'HID-compliant game controller'
Mfg: u'(Standard system devices)'
RID_DEVICE_INFO_HID(
dwVendorId = 1118L,
dwProductId = 39L,
dwVersionNumber = 257L,
usUsagePage = 327681L,
usUsage = 0L,
)
Device: 5:
DeviceName: '\\??\\Root#RDP_KBD#0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}'
DeviceDesc: u'Terminal Server Keyboard Driver'
Mfg: u'(Standard system devices)'
RID_DEVICE_INFO_KEYBOARD(
dwType = 81L,
dwSubType = 0L,
dwKeyboardMode = 1L,
dwNumberOfFunctionKeys = 12L,
dwNumberOfIndicators = 3L,
dwNumberOfKeysTotal = 101L,
)
Device: 6:
DeviceName: '\\??\\HID#Vid_0c16&Pid_0001&MI_00#8&209fb4f5&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}'
DeviceDesc: u'HID Keyboard Device'
Mfg: u'(Standard keyboards)'
RID_DEVICE_INFO_KEYBOARD(
dwType = 81L,
dwSubType = 0L,
dwKeyboardMode = 1L,
dwNumberOfFunctionKeys = 12L,
dwNumberOfIndicators = 3L,
dwNumberOfKeysTotal = 110L,
)
Device: 7:
DeviceName: '\\??\\ACPI#PNP0303#3&13c0b0c5&0#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}'
DeviceDesc: u'Standard 101/102-Key or Microsoft Natural PS/2 Keyboard'
Mfg: u'(Standard keyboards)'
RID_DEVICE_INFO_KEYBOARD(
dwType = 4L,
dwSubType = 0L,
dwKeyboardMode = 1L,
dwNumberOfFunctionKeys = 12L,
dwNumberOfIndicators = 3L,
dwNumberOfKeysTotal = 101L,
)
Device: 8:
DeviceName: '\\??\\Root#RDP_MOU#0000#{378de44c-56ef-11d1-bc8c-00a0c91405dd}'
DeviceDesc: u'Terminal Server Mouse Driver'
Mfg: u'(Standard system devices)'
RID_DEVICE_INFO_MOUSE(
dwId = 2L,
dwNumberOfButtons = 2L,
dwSampleRate = 60L,
fHasHorizontalWheel = 0,
)
Device: 9:
DeviceName: '\\??\\HID#Vid_0c16&Pid_0001&MI_01&Col01#8&3863413a&0&0000#{378de44c-56ef-11d1-bc8c-00a0c91405dd}'
DeviceDesc: u'HID-compliant mouse'
Mfg: u'Microsoft'
RID_DEVICE_INFO_MOUSE(
dwId = 256L,
dwNumberOfButtons = 9L,
dwSampleRate = 0L,
fHasHorizontalWheel = 0,
)
Device: 10:
DeviceName: '\\??\\ACPI#PNP0F13#3&13c0b0c5&0#{378de44c-56ef-11d1-bc8c-00a0c91405dd}'
DeviceDesc: u'PS/2 Compatible Mouse'
Mfg: u'Microsoft'
RID_DEVICE_INFO_MOUSE(
dwId = 32L,
dwNumberOfButtons = 5L,
dwSampleRate = 100L,
fHasHorizontalWheel = 0,
)
StevenPr
 
Posts: 20
Joined: Sun Oct 08, 2006 1:02 pm

Postby Bitmonster » Sun Jan 21, 2007 3:25 pm

Ok, the Firefly mini seems to add the following devices:

Device: 0:
DeviceName: '\\??\\HID#Vid_1233&Pid_e007&MI_01&Col03#8&39e36faf&0&0002#{4d1e55b2-f16f-11cf-88cb-001111000030}'
DeviceDesc: u'HID-compliant consumer control device'
Mfg: u'Microsoft'
RID_DEVICE_INFO_HID(
dwVendorId = 4659L,
dwProductId = 57351L,
dwVersionNumber = 256L,
usUsagePage = 65548L,
usUsage = 0L,
)

Device: 7:
DeviceName: '\\??\\HID#Vid_1233&Pid_e007&MI_00#8&2b0fbe81&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}'
DeviceDesc: u'HID Keyboard Device'
Mfg: u'(Standard keyboards)'
RID_DEVICE_INFO_KEYBOARD(
dwType = 81L,
dwSubType = 0L,
dwKeyboardMode = 1L,
dwNumberOfFunctionKeys = 12L,
dwNumberOfIndicators = 3L,
dwNumberOfKeysTotal = 264L,
)
Device: 11:
DeviceName: '\\??\\HID#Vid_1233&Pid_e007&MI_01&Col01#8&39e36faf&0&0000#{378de44c-56ef-11d1-bc8c-00a0c91405dd}'
DeviceDesc: u'HID-compliant mouse'
Mfg: u'Microsoft'
RID_DEVICE_INFO_MOUSE(
dwId = 256L,
dwNumberOfButtons = 3L,
dwSampleRate = 0L,
fHasHorizontalWheel = 0,
)

Interestingly it also adds a mouse. Does the Firefly mini have any buttons to emulate mouse functions?
User avatar
Bitmonster
Site Admin
 
Posts: 2239
Joined: Mon Feb 06, 2006 10:28 pm

Postby StevenPr » Sun Jan 21, 2007 5:44 pm

No mouse emulation.

Steve
StevenPr
 
Posts: 20
Joined: Sun Oct 08, 2006 1:02 pm

Postby Bitmonster » Tue Feb 13, 2007 11:37 am

@StevenPr
Developer Bartman has created a basic HID plugin, that is included in the latest beta version. If you add it to your configuration, you should find a 'HID-compliant consumer control device' in the list that you can enable. We are interested if you get any events from your Firefly mini through this plugin and how these events look like.
User avatar
Bitmonster
Site Admin
 
Posts: 2239
Joined: Mon Feb 06, 2006 10:28 pm

HID

Postby StevenPr » Wed Feb 14, 2007 11:08 am

I had to unload the remote driver before HID would could even be added to Startup.

I found 2 devices with the vendor ID. I added them as FFM1, FFM2. The keyboard functions don't appear, this being things like the arrows and numbers. That maybe the HID I didn't find. All codes come from the same device. Would you like me to map out the keys so you can add names to them? Or even a plugin for me to name them then create an XML file I can submit so you can build a library.

Each keypress generates 2 events.
Record:
HID.FFM1.030B
HID.FFM1.0300

Menu:
HID.FFM1.030F
HID.FFM1.0300

I can see this being useful. Remap keys of a specific keyboard rather than all or none. Thank you for the plugin.

Steve
StevenPr
 
Posts: 20
Joined: Sun Oct 08, 2006 1:02 pm

Postby Bitmonster » Wed Feb 14, 2007 11:27 am

Did the HID.FFM1.0300 show up in the moment you release the button?
Does this event come on every keypress, that can be received through the HID plugin?
User avatar
Bitmonster
Site Admin
 
Posts: 2239
Joined: Mon Feb 06, 2006 10:28 pm

HID

Postby StevenPr » Wed Feb 14, 2007 8:55 pm

HID.FFM1.030B shows the moment I press Record button and nothing as long as I hold it. HID.FFM1.0300 appears immediately when I release the button.

Every key has it's own start code but always ends on HID.FFM1.0300.

Steve
StevenPr
 
Posts: 20
Joined: Sun Oct 08, 2006 1:02 pm

Postby Bitmonster » Wed Feb 14, 2007 8:59 pm

Ok, this sounds fine. Then we need all (first) button-codes and their names to create a mapping.
User avatar
Bitmonster
Site Admin
 
Posts: 2239
Joined: Mon Feb 06, 2006 10:28 pm

Postby Bartman » Wed Feb 14, 2007 9:16 pm

Thanks for testing.
The keyboard part of the remote won't show in the list, because mice and keyboard devices are opened exclusively by windows and therefore cannot be used by my plug in.
Are record and menu the only non keyboard emulated buttons?
What happens when you press both buttons at the same time?

Maybe I can look into the button caps of the device. (A device can somehow tell how many buttons it has and how they are represented in the sent data. But currently I have no clue how it works;)
This would allow to distinguish between pressing and releasing buttons and trigger enduring events to make use of EGs auto repeat and long press functions.
Bartman
Plugin Developer
 
Posts: 881
Joined: Sun Feb 12, 2006 9:03 am

Next

Return to General Support

Who is online

Users browsing this forum: Bing [Bot], Google [Bot] and 5 guests