ChriD / node-raumserver

A nodejs module/server to control the raumfeld multiroomsystem via HTTP-Requests
58 stars 14 forks source link

Teufel One S: Action was rejected #47

Closed gahujipo closed 6 years ago

gahujipo commented 6 years ago

I installed another Raumfeld Streaming Speaker: the new Teufel One S (not the Raumfeld One) in my bathroom (Bad). The zone config gives me:

{
    requestUrl: "/raumserver/data/getZoneConfig?_=1513625399487",
    action: "getZoneConfig",
    error: false,
    msg: "",
    data: {
        zoneConfig: {
            $: {
                numRooms: "2",
                spotifyMode: "multiRoom"
            },
            zones: [{
                zone: [{
                    $: {
                        udn: "uuid:ffffffff-8d8b-fce1-ffff-ffff8d8bfce1",
                        spotifyConnect: "active"
                    },
                    room: [{
                            $: {
                                name: "Zimmer",
                                udn: "uuid:871ab9db-6305-4cf6-8633-6d7405faadd5",
                                powerState: "ACTIVE"
                            },
                            renderer: [{
                                $: {
                                    udn: "uuid:e6d93437-8afd-46e0-8eb6-adebaf0f325c",
                                    name: "Speaker Zimmer"
                                }
                            }]
                        },
                        {
                            $: {
                                name: "Bad",
                                udn: "uuid:cc02eb36-b0d8-40ef-8743-0078cfb4d9c5",
                                powerState: "ACTIVE"
                            },
                            renderer: [{
                                $: {
                                    udn: "uuid:645f498e-4840-46b1-9305-a4dc2a62a439",
                                    name: "Speaker Bad #3"
                                }
                            }]
                        }
                    ]
                }]
            }]
        }
    }
}

I can control "(Speaker) Zimmer" perfectly as always. But when I send zone specific GETs for the bathroom to the raumserver it gives me always

{
    requestUrl: "/raumserver/controller/pause?id=Bad&_=1513625399488",
    action: "pause",
    error: true,
    msg: "Action was rejected",
    data: {
        errorMessage: "Error: VirtualMediaRenderer for id 'Bad' not found",
        errorData: null
    }
}

The Raumfeld One S never had that problems. It seems to me as an incompatibility with the newer devices?

Log shows:

verbose: [Raumserver] Request received: GET /raumserver/controller/pause?id=Bad&_=1513625399490
debug: [Raumserver] Request to raumserver recognized: /raumserver/controller/pause?id=Bad&_=1513625399490
debug: [Raumserver] Handle action 'pause' with query: {"_":"1513625399490","id":"Bad"}
debug: [DeviceManager] Trying to get virtual media renderer for id or (child)name : Bad
debug: [DeviceManager] Trying to get media renderer for id name : Bad
debug: [ZoneManager] Get room information object for: uuid:e6d93437-8afd-46e0-8eb6-adebaf0f325c
error: [Request.pause] VirtualMediaRenderer for id 'Bad' not found
error: [Request.pause] Some renderers had exceptions:  Error: VirtualMediaRenderer for id 'Bad' not found
    at Request_Pause.run (/opt/loxberry/data/plugins/raumserver/node_modules/node-raumserver/lib/lib.base.requestMediaRenderer.js:95:27)
    at Raumserver.handleRequestObject (/opt/loxberry/data/plugins/raumserver/node_modules/node-raumserver/lib/lib.raumserver.js:143:28)
    at Raumserver.requestReceived (/opt/loxberry/data/plugins/raumserver/node_modules/node-raumserver/lib/lib.raumserver.js:106:22)
    at Server.<anonymous> (/opt/loxberry/data/plugins/raumserver/node_modules/node-raumserver/lib/lib.raumserver.js:80:26)
    at emitTwo (events.js:126:13)
    at Server.emit (events.js:214:7)
    at parserOnIncoming (_http_server.js:602:12)
    at HTTPParser.parserOnHeadersComplete (_http_common.js:117:23)
error: [Raumserver] Request was rejected:  errorMessage=Error: VirtualMediaRenderer for id 'Bad' not found, errorData=null

@ChriD do you have an idea? Let me know if you need further infos.

gahujipo commented 6 years ago

I thought it might be a good idea to avoid the sharp (#) in the Speakername so i reset the speaker in the bathroom to its factory default and configured it as "Badezimmer". So my new zone config now is

{
    requestUrl: "/raumserver/data/getZoneConfig?_=1515012656289",
    action: "getZoneConfig",
    error: false,
    msg: "",
    data: {
        zoneConfig: {
            $: {
                numRooms: "2",
                spotifyMode: "multiRoom"
            },
            zones: [{
                zone: [{
                    $: {
                        udn: "uuid:ffffffff-8d8b-fce1-ffff-ffff8d8bfce1",
                        spotifyConnect: "active"
                    },
                    room: [{
                            $: {
                                name: "Badezimmer",
                                udn: "uuid:56d49d64-0eaa-4f35-a0b2-4f3f102e550d",
                                powerState: "ACTIVE"
                            },
                            renderer: [{
                                $: {
                                    udn: "uuid:645f498e-4840-46b1-9305-a4dc2a62a439",
                                    name: "Speaker Badezimmer"
                                }
                            }]
                        },
                        {
                            $: {
                                name: "Zimmer",
                                udn: "uuid:871ab9db-6305-4cf6-8633-6d7405faadd5",
                                powerState: "ACTIVE"
                            },
                            renderer: [{
                                $: {
                                    udn: "uuid:e6d93437-8afd-46e0-8eb6-adebaf0f325c",
                                    name: "Speaker Zimmer"
                                }
                            }]
                        }
                    ]
                }]
            }]
        }
    }
}

It doesn't solve the problem. But what i realised is that when I send commands to

id=Badezimmer

doesn't work at all. But some commands work when i send them with

id=Speaker Badezimmer

Commands against the speaker name, that work are

Commands that do not work are:

They time out with no entry in the log.

What is going on here? Since today I always set the id to the room name, not the speakers name. That is really strange...

Again the log entries that appear when sending getRendererState against the room name (in this case "Badezimmer", not "Speaker Badezimmer") are:

verbose: [Raumserver] Request received: GET /raumserver/controller/getRendererState?id=Badezimmer&_=1515013318514
debug: [Raumserver] Request to raumserver recognized: /raumserver/controller/getRendererState?id=Badezimmer&_=1515013318514
debug: [Raumserver] Handle action 'getRendererState' with query: {"_":"1515013318514","id":"Badezimmer"}
debug: [DeviceManager] Trying to get virtual media renderer for id or (child)name : Badezimmer
debug: [DeviceManager] Trying to get media renderer for id name : Badezimmer
debug: [ZoneManager] Get room information object for: uuid:e6d93437-8afd-46e0-8eb6-adebaf0f325c
debug: [Request.getRendererState] No updateId given for action 'getRendererState'. Using direct execution
error: [Request.getRendererState] Media Renderer for id 'Badezimmer' not found
error: [Raumserver] Request was rejected:  errorMessage=Error: Media Renderer for id 'Badezimmer' not found, errorData=null

The error message after sending a pause command could be more helpful:

verbose: [Raumserver] Request received: GET /raumserver/controller/pause?id=Badezimmer&_=1515013318523
debug: [Raumserver] Request to raumserver recognized: /raumserver/controller/pause?id=Badezimmer&_=1515013318523
debug: [Raumserver] Handle action 'pause' with query: {"_":"1515013318523","id":"Badezimmer"}
debug: [DeviceManager] Trying to get virtual media renderer for id or (child)name : Badezimmer
debug: [DeviceManager] Trying to get media renderer for id name : Badezimmer
debug: [ZoneManager] Get room information object for: uuid:e6d93437-8afd-46e0-8eb6-adebaf0f325c
error: [Request.pause] VirtualMediaRenderer for id 'Badezimmer' not found
error: [Request.pause] Some renderers had exceptions:  Error: VirtualMediaRenderer for id 'Badezimmer' not found
    at Request_Pause.run (/opt/loxberry/data/plugins/raumserver/node_modules/node-raumserver/lib/lib.base.requestMediaRenderer.js:95:27)
    at Raumserver.handleRequestObject (/opt/loxberry/data/plugins/raumserver/node_modules/node-raumserver/lib/lib.raumserver.js:143:28)
    at Raumserver.requestReceived (/opt/loxberry/data/plugins/raumserver/node_modules/node-raumserver/lib/lib.raumserver.js:106:22)
    at Server.<anonymous> (/opt/loxberry/data/plugins/raumserver/node_modules/node-raumserver/lib/lib.raumserver.js:80:26)
    at emitTwo (events.js:126:13)
    at Server.emit (events.js:214:7)
    at parserOnIncoming (_http_server.js:602:12)
    at HTTPParser.parserOnHeadersComplete (_http_common.js:117:23)
error: [Raumserver] Request was rejected:  errorMessage=Error: VirtualMediaRenderer for id 'Badezimmer' not found, errorData=null

Let me know if i can check you something in the UPnP structure of the device. Maybe the newer Raumfelds have some changed nodes there. Is that maybe the reason why the VirtualMediaRenderer for the room id can't be found?

ChriD commented 6 years ago

It should be no difference if you use the speaker name or the room name. (In fact there can be 2 speakers in one room but that is hardly the case). The system should find the renderer no matter what name you use.

I do have the old "Raumfeld OneS" in my Bathroom and there is no Problem as you mentioned in the first post. I may have to add some more logs to get an idea what the issue is or maybe its better to add a request which will list me the device objects with their properties the kernel is holding.

I think i will create a "systemInfo" request. I will response here if i have updated the server

gahujipo commented 6 years ago

It should be no difference if you use the speaker name or the room name. The system should find the renderer no matter what name you use.

I can confirm, that there is some difference.

I do have the old "Raumfeld OneS" in my Bathroom and there is no Problem as you mentioned in the first post.

Exactly, with the Raumfeld One S it always worked as expected, the problem appeared when I replaced them with the new Teufel One S.

I may have to add some more logs to get an idea what the issue is or maybe its better to add a request which will list me the device objects with their properties the kernel is holding. I think i will create a "systemInfo" request. I will response here if i have updated the server

Amazing, thank you in the meantime. As always: let me know if you need additional info.

ChriD commented 6 years ago

@gahujipo Can you please check your logs if you got a line which says

"Device ... of type ... (...) not usable"

and check if bathroom is mentioned there? You do not need to update the kernel or server

Thanks!

gahujipo commented 6 years ago

I "grepped" for the word "useable" in the log until approx. 20 seconds after the startup of node-raumserver. The output is:

verbose: [DeviceManager] Media server 'Raumfeld MediaServer' is useable
verbose: [DeviceManager] Raumfeld media renderer 'Speaker Zimmer' is useable
verbose: [DeviceManager] Media renderer 'Speaker Badezimmer' is useable
verbose: [DeviceManager] Media Renderer 'Zimmer' is useable
gahujipo commented 6 years ago

After updating both kernel and raumserver i realised that when I send the command

/raumserver/controller/volumeDown?id=Speaker%20Badezimmer&value=1

does what it should do. It raises the volume up 1% for Speaker Zimmer and Speaker Badezimmer, but it writes in the log:

error: [Raumserver] Request was rejected because unknown path

But

/raumserver/controller/volumeDown?id=Speaker%20Badezimmer&value=1&scope=room

does nothing and outputs just the entry above.

Zone config remained the same as described in my previous comments.

ChriD commented 6 years ago

Ok. This one: error: [Raumserver] Request was rejected because unknown path is thrown by the favicon.ico request of the browsers. I will supress this error in the next version if its thrown by the favicon request

So the following works? /raumserver/controller/volumeDown?id=Speaker%20Badezimmer&value=1 That's good!

And this one?: /raumserver/controller/volumeDown?id=Speaker%20Badezimmer&value=1&scope=room

In fact it should be possible to use the Speaker name but it is best practice to use the room name If both commands work, than its good and there is no problem.

Wenn du den Fehler nochmal bekommst mit "Zone for Badezimmer not found" Kannst du dann, (ohne das du auf der RF App was machst) die Zonenconfig über den Server (getZoneConfig)nochmal ansehen?

Danke!

gahujipo commented 6 years ago

So the following works? /raumserver/controller/volumeDown?id=Speaker%20Badezimmer&value=1 That's good!

Yep. That works. Note that it works only for the speaker name, not when i use the room name.

And this one?: /raumserver/controller/volumeDown?id=Speaker%20Badezimmer&value=1&scope=room

It returns

{"requestUrl":"/raumserver/controller/volumeDown?id=Speaker%20Badezimmer&value=1&scope=room","action":"volumeDown","error":false,"msg":"","data":{"udn":"uuid:ffffffff-8d8b-fce1-ffff-ffff8d8bfce1"}}

but has no effect on the speaker.

Wenn du den Fehler nochmal bekommst mit "Zone for Badezimmer not found"

Which error do you mean exactly? Is that really the text you are expecting? I think none of the errors i previously got, returned that kind of output.

ChriD commented 6 years ago

Can you give me the output of "getRendererState" request plerase? Without any queries, so i get the info for all renderers

gahujipo commented 6 years ago
{
    requestUrl: "/raumserver/controller/getRendererState?id=Speaker%20Badezimmer&_=1516175803462",
    action: "getRendererState",
    error: false,
    msg: "",
    data: [{
        InstanceID: 0,
        CurrentTrackMetaData: "",
        CurrentRecordQualityMode: "NOT_IMPLEMENTED",
        AbsoluteTimePosition: "00:00:00",
        SecondsUntilSleep: "0",
        CurrentTrack: "0",
        AVTransportURIMetaData: "",
        PossiblePlaybackStorageMedia: "NETWORK",
        TransportPlaySpeed: "1",
        CurrentTrackDuration: "00:00:00",
        PossibleRecordQualityModes: "NOT_IMPLEMENTED",
        TransportError: "",
        PossibleRecordStorageMedia: "NONE",
        AVTransportURI: "",
        RelativeTimePosition: "00:00:00",
        RelativeCounterPosition: "1",
        CurrentPlayMode: "NORMAL",
        Bitrate: "0",
        TransportState: "NO_MEDIA_PRESENT",
        AbsoluteCounterPosition: "1",
        CurrentTransportActions: "",
        RoomStates: "uuid:871ab9db-6305-4cf6-8633-6d7405faadd5=STOPPED",
        ContentType: "",
        NumberOfTracks: "0",
        SleepTimerActive: "0",
        TransportStatus: "OK",
        CurrentTrackURI: "",
        mute: 0,
        RoomVolumes: "uuid:871ab9db-6305-4cf6-8633-6d7405faadd5=26,uuid:56d49d64-0eaa-4f35-a0b2-4f3f102e550d=41",
        Volume: "41",
        Mute: "0",
        RoomMutes: "uuid:871ab9db-6305-4cf6-8633-6d7405faadd5=0,uuid:56d49d64-0eaa-4f35-a0b2-4f3f102e550d=0",
        rooms: [{
                roomUDN: "uuid:871ab9db-6305-4cf6-8633-6d7405faadd5",
                transportState: "STOPPED",
                online: true,
                volume: "26",
                mute: "0",
                name: "Zimmer",
                udn: "uuid:871ab9db-6305-4cf6-8633-6d7405faadd5",
                powerState: "AUTOMATIC_STANDBY",
                renderer: [{
                    udn: "uuid:e6d93437-8afd-46e0-8eb6-adebaf0f325c",
                    name: "Speaker Zimmer"
                }]
            },
            {
                roomUDN: "uuid:56d49d64-0eaa-4f35-a0b2-4f3f102e550d",
                volume: "41",
                mute: "0",
                online: true,
                name: "Badezimmer",
                udn: "uuid:56d49d64-0eaa-4f35-a0b2-4f3f102e550d",
                powerState: "MANUAL_STANDBY",
                renderer: [{
                    udn: "uuid:645f498e-4840-46b1-9305-a4dc2a62a439",
                    name: "Speaker Badezimmer"
                }]
            }
        ],
        udn: "uuid:ffffffff-8d8b-fce1-ffff-ffff8d8bfce1",
        mediaItem: null,
        friendlyName: "Zimmer",
        host: "192.168.0.113",
        manufacturer: "Raumfeld GmbH",
        modelNumber: "2"
    }]
}
ChriD commented 6 years ago

WITHOUT any queries please (please remove ID=...) I need the virtual renderer info

ChriD commented 6 years ago

HUH! I see you have 2 renderers in your room?!?! If you use "Zimmer" instead of "Badezimmer" it will work :)

EDIT: Sorry.. i did missinterpret the data. Please give me the full list as mentioned in the last comment

gahujipo commented 6 years ago
{
    requestUrl: "/raumserver/controller/getRendererState?id=&_=1516175803463",
    action: "getRendererState",
    error: false,
    msg: "",
    data: [{
            InstanceID: 0,
            CurrentTrackMetaData: "",
            CurrentRecordQualityMode: "NOT_IMPLEMENTED",
            AbsoluteTimePosition: "00:00:00",
            SecondsUntilSleep: "0",
            CurrentTrack: "0",
            AVTransportURIMetaData: "",
            PossiblePlaybackStorageMedia: "NETWORK",
            TransportPlaySpeed: "1",
            CurrentTrackDuration: "00:00:00",
            PossibleRecordQualityModes: "NOT_IMPLEMENTED",
            TransportError: "",
            PossibleRecordStorageMedia: "NONE",
            AVTransportURI: "",
            RelativeTimePosition: "00:00:00",
            RelativeCounterPosition: "1",
            CurrentPlayMode: "NORMAL",
            Bitrate: "0",
            TransportState: "NO_MEDIA_PRESENT",
            AbsoluteCounterPosition: "1",
            CurrentTransportActions: "",
            RoomStates: "uuid:871ab9db-6305-4cf6-8633-6d7405faadd5=STOPPED",
            ContentType: "",
            NumberOfTracks: "0",
            SleepTimerActive: "0",
            TransportStatus: "OK",
            CurrentTrackURI: "",
            mute: 0,
            RoomVolumes: "uuid:871ab9db-6305-4cf6-8633-6d7405faadd5=26,uuid:56d49d64-0eaa-4f35-a0b2-4f3f102e550d=41",
            Volume: "41",
            Mute: "0",
            RoomMutes: "uuid:871ab9db-6305-4cf6-8633-6d7405faadd5=0,uuid:56d49d64-0eaa-4f35-a0b2-4f3f102e550d=0",
            rooms: [{
                    roomUDN: "uuid:871ab9db-6305-4cf6-8633-6d7405faadd5",
                    transportState: "STOPPED",
                    online: true,
                    volume: "26",
                    mute: "0",
                    name: "Zimmer",
                    udn: "uuid:871ab9db-6305-4cf6-8633-6d7405faadd5",
                    powerState: "AUTOMATIC_STANDBY",
                    renderer: [{
                        udn: "uuid:e6d93437-8afd-46e0-8eb6-adebaf0f325c",
                        name: "Speaker Zimmer"
                    }]
                },
                {
                    roomUDN: "uuid:56d49d64-0eaa-4f35-a0b2-4f3f102e550d",
                    volume: "41",
                    mute: "0",
                    online: true,
                    name: "Badezimmer",
                    udn: "uuid:56d49d64-0eaa-4f35-a0b2-4f3f102e550d",
                    powerState: "MANUAL_STANDBY",
                    renderer: [{
                        udn: "uuid:645f498e-4840-46b1-9305-a4dc2a62a439",
                        name: "Speaker Badezimmer"
                    }]
                }
            ],
            udn: "uuid:ffffffff-8d8b-fce1-ffff-ffff8d8bfce1",
            mediaItem: null,
            friendlyName: "Zimmer",
            host: "192.168.0.113",
            manufacturer: "Raumfeld GmbH",
            modelNumber: "2"
        },
        {
            InstanceID: 0,
            AVTransportURIMetaData: "",
            CurrentTrackDuration: "NOT_IMPLEMENTED",
            PowerState: "AUTOMATIC_STANDBY",
            AVTransportURI: "",
            CurrentPlayMode: "NORMAL",
            TransportState: "NO_MEDIA_PRESENT",
            CurrentTransportActions: "",
            TransportStatus: "OK",
            LowDB: "0.000000",
            Mute: "0",
            MidDB: "0.000000",
            HighDB: "0.000000",
            Volume: "26",
            VolumeDB: "-6772",
            Balance: "0",
            rooms: [{
                name: "Zimmer",
                udn: "uuid:871ab9db-6305-4cf6-8633-6d7405faadd5",
                powerState: "AUTOMATIC_STANDBY",
                renderer: [{
                    udn: "uuid:e6d93437-8afd-46e0-8eb6-adebaf0f325c",
                    name: "Speaker Zimmer"
                }]
            }],
            udn: "uuid:e6d93437-8afd-46e0-8eb6-adebaf0f325c",
            mediaItem: null,
            friendlyName: "Speaker Zimmer",
            host: "192.168.0.113",
            manufacturer: "Raumfeld GmbH",
            modelNumber: "2"
        }
    ]
}
ChriD commented 6 years ago

I am not sure if it may be the problem. But the new Speaker-S for sure has another ManufacturereID Are you able to get me the new ManufacturerID (Intel Device UPNP Tools)?

gahujipo commented 6 years ago

is this what you are looking for? image

ChriD commented 6 years ago

YEP! Thanks!

ChriD commented 6 years ago

I have updated the kernel and the server. Can you please update yours and try the volume command again with the Room Name? Please set log Level to 5 I have added some more logs and added the new ManufacturereID

gahujipo commented 6 years ago
{"requestUrl":"/raumserver/controller/volumeUp?id=Badezimmer&value=1","action":"volumeUp","error":true,"msg":"Action was rejected","data":{"errorMessage":"ReferenceError: zoneUDN is not defined","errorData":null}}

outputs now:

error: [DeviceManager] Error: connect EHOSTUNREACH 192.168.0.4:80
silly: [DeviceManager] Check connection with the host!
silly: [DeviceManager] Check connection with the host!
silly: [DeviceManager] Check connection with the host!
silly: [DeviceManager] Check connection with the host!
verbose: [Raumserver] Request received: GET /raumserver/controller/volumeUp?id=Badezimmer&value=1
debug: [Raumserver] Request to raumserver recognized: /raumserver/controller/volumeUp?id=Badezimmer&value=1
debug: [Raumserver] Handle action 'volumeUp' with query: {"id":"Badezimmer","value":"1"}
debug: [DeviceManager] Trying to get virtual media renderer for id or (child)name : Badezimmer
debug: [DeviceManager] Trying to get media renderer for id name : Badezimmer
debug: [ZoneManager] Get room information object for: uuid:e6d93437-8afd-46e0-8eb6-adebaf0f325c
debug: [ZoneManager] Get room information object for: uuid:645f498e-4840-46b1-9305-a4dc2a62a439
debug: [DeviceManager] Media renderer for id : Badezimmer found
silly: [ZoneManager] badezimmer = uuid:645f498e-4840-46b1-9305-a4dc2a62a439
error: [Request.volumeUp] Some renderers had exceptions:  ReferenceError: zoneUDN is not defined
    at DeviceManager.getVirtualMediaRenderer (/opt/loxberry/data/plugins/raumserver/node_modules/node-raumserver/node_modules/node-raumkernel/lib/lib.manager.deviceManager.js:711:44)
    at Request_VolumeUp.getMediaRenderersFromIdAndScope (/opt/loxberry/data/plugins/raumserver/node_modules/node-raumserver/lib/lib.base.request.js:134:68)
    at Request_VolumeUp.run (/opt/loxberry/data/plugins/raumserver/node_modules/node-raumserver/lib/lib.base.requestMediaRenderer.js:68:39)
    at Raumserver.handleRequestObject (/opt/loxberry/data/plugins/raumserver/node_modules/node-raumserver/lib/lib.raumserver.js:148:28)
    at Raumserver.requestReceived (/opt/loxberry/data/plugins/raumserver/node_modules/node-raumserver/lib/lib.raumserver.js:111:22)
    at Server.<anonymous> (/opt/loxberry/data/plugins/raumserver/node_modules/node-raumserver/lib/lib.raumserver.js:80:26)
    at emitTwo (events.js:126:13)
    at Server.emit (events.js:214:7)
    at parserOnIncoming (_http_server.js:602:12)
    at HTTPParser.parserOnHeadersComplete (_http_common.js:117:23)
error: [Raumserver] Request was rejected:  errorMessage=ReferenceError: zoneUDN is not defined, errorData=null

while 192.168.0.4 is not a Raumfeld Device (but has some UPnP/SSDP functionality)

I get the same output when I add "&scope=room".

Raumserver isn't working for none of the zones. Even the other Pair of Speakers (Zimmer) aren't controllable anymore. A command against them output the same kind of error.

ChriD commented 6 years ago

Oh.. Big failure. Please update again. I introduced a "spelling" bug i corrected it

gahujipo commented 6 years ago

Amazing! 👍 PayPal donation is out.