Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
M
mediactl
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
medientechnik
ext-lib
mediactl
Commits
04e21cd0
Commit
04e21cd0
authored
3 weeks ago
by
David Huss
Browse files
Options
Downloads
Patches
Plain Diff
Cooldown timeout for projector
parent
19b600fd
Branches
master
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/mediactl/devices/projector.py
+48
-6
48 additions, 6 deletions
src/mediactl/devices/projector.py
with
48 additions
and
6 deletions
src/mediactl/devices/projector.py
+
48
−
6
View file @
04e21cd0
...
@@ -4,6 +4,7 @@ import mediactl
...
@@ -4,6 +4,7 @@ import mediactl
from
datetime
import
datetime
,
timedelta
from
datetime
import
datetime
,
timedelta
from
result
import
Result
,
Ok
,
Err
from
result
import
Result
,
Ok
,
Err
from
functools
import
wraps
from
functools
import
wraps
from
typing
import
Optional
class
ConnectionState
(
mediactl
.
EnumState
):
class
ConnectionState
(
mediactl
.
EnumState
):
...
@@ -95,7 +96,9 @@ def projector_connection(endpoint: str, purpose: str, method: str = "post"):
...
@@ -95,7 +96,9 @@ def projector_connection(endpoint: str, purpose: str, method: str = "post"):
try
:
try
:
d
=
response
.
json
()
d
=
response
.
json
()
except
requests
.
exceptions
.
JSONDecodeError
as
e
:
except
requests
.
exceptions
.
JSONDecodeError
as
e
:
print
(
f
"
When sending a
{
method
}
-request to
{
self
.
addr
}
/
{
endpoint
}
error just happened:
"
)
print
(
f
"
When sending a
{
method
}
-request to
{
self
.
addr
}
/
{
endpoint
}
error just happened:
"
)
print
(
f
"
{
e
}
"
)
print
(
f
"
{
e
}
"
)
print
(
f
"
status:
{
response
.
status_code
}
"
)
print
(
f
"
status:
{
response
.
status_code
}
"
)
print
(
repr
(
response
))
print
(
repr
(
response
))
...
@@ -127,13 +130,22 @@ class Projector(mediactl.WithLogger):
...
@@ -127,13 +130,22 @@ class Projector(mediactl.WithLogger):
self
.
addr
=
addr
self
.
addr
=
addr
self
.
timeout
=
1.0
self
.
timeout
=
1.0
self
.
status
=
self
.
get_default_status
()
self
.
status
=
self
.
get_default_status
()
self
.
_cooldown_since
:
Optional
[
datetime
]
=
None
@projector_connection
(
endpoint
=
"
status
"
,
purpose
=
"
get status
"
,
method
=
"
get
"
)
@projector_connection
(
endpoint
=
"
status
"
,
purpose
=
"
get status
"
,
method
=
"
get
"
)
async
def
update_status
(
self
)
->
Result
[
dict
,
str
]:
async
def
update_status
(
self
)
->
Result
[
dict
,
str
]:
global
data
global
data
data
=
data
# noqa: F821 variable "data" set by decorator
data
=
data
# noqa: F821 variable "data" set by decorator
self
.
status
[
"
connection
"
]
=
ConnectionState
.
connected
self
.
status
[
"
connection
"
]
=
ConnectionState
.
connected
self
.
status
[
"
power
"
]
=
PowerState
(
data
[
"
power
"
][
"
state
"
])
# 2) Compute the new PowerState from whatever raw payload we got:
new_power
=
PowerState
(
data
[
"
power
"
][
"
state
"
])
# 3) If it changed, record the timestamp:
old_power
=
self
.
status
.
get
(
"
power
"
)
if
old_power
is
None
or
new_power
is
not
old_power
:
# State actually changed, so set “power_since = now”
self
.
status
[
"
power_since
"
]
=
datetime
.
now
()
self
.
status
[
"
power
"
]
=
new_power
self
.
status
[
"
shutter
"
]
=
ShutterState
(
data
[
"
shutter
"
][
"
state
"
])
self
.
status
[
"
shutter
"
]
=
ShutterState
(
data
[
"
shutter
"
][
"
state
"
])
self
.
status
[
"
testpattern
"
]
=
TestPatternState
(
data
[
"
testpattern
"
])
self
.
status
[
"
testpattern
"
]
=
TestPatternState
(
data
[
"
testpattern
"
])
self
.
status
[
"
lamp
"
]
=
data
[
"
lamp
"
][
"
hours
"
]
self
.
status
[
"
lamp
"
]
=
data
[
"
lamp
"
][
"
hours
"
]
...
@@ -144,19 +156,49 @@ class Projector(mediactl.WithLogger):
...
@@ -144,19 +156,49 @@ class Projector(mediactl.WithLogger):
return
{
return
{
"
connection
"
:
ConnectionState
.
unknown
,
"
connection
"
:
ConnectionState
.
unknown
,
"
power
"
:
PowerState
.
unknown
,
"
power
"
:
PowerState
.
unknown
,
"
power_since
"
:
None
,
"
shutter
"
:
ShutterState
.
unknown
,
"
shutter
"
:
ShutterState
.
unknown
,
"
testpattern
"
:
TestPatternState
.
unknown
,
"
testpattern
"
:
TestPatternState
.
unknown
,
"
time
"
:
None
,
"
time
"
:
None
,
}
}
async
def
get_status
(
self
)
->
dict
:
async
def
get_status
(
self
)
->
dict
:
"""
1) Call update_status() to fetch the raw status.
2) If status[
"
power
"
] == PowerState.cooldown, start/check a cooldown timer.
- If this cooldown has lasted > 60 seconds, force status[
"
power
"
] to PowerState.off.
3) Return the (possibly modified) self.status.
"""
response
=
await
self
.
update_status
()
response
=
await
self
.
update_status
()
if
response
.
is_err
():
if
response
.
is_err
():
self
.
log_error
(
response
.
err_value
)
self
.
log_error
(
response
.
err_value
)
# Return previous status on error
return
self
.
status
# on error, return last‐known
return
self
.
status
proj_stat
=
response
.
unwrap
()
now
=
datetime
.
now
()
# ───── You can adjust this timeout as needed ─────
COOLDOWN_TIMEOUT
=
timedelta
(
seconds
=
60
)
current_power
=
proj_stat
.
get
(
"
power
"
)
if
current_power
==
PowerState
.
cooldown
:
# If we just entered "cooldown", record the timestamp
if
self
.
_cooldown_since
is
None
:
self
.
_cooldown_since
=
now
else
:
# Already in "cooldown"—check elapsed time
elapsed
=
now
-
self
.
_cooldown_since
if
elapsed
>
COOLDOWN_TIMEOUT
:
# Timed out → treat as "off" now
proj_stat
[
"
power
"
]
=
PowerState
.
off
# Clear the timer so we don't re‐enter this block
self
.
_cooldown_since
=
None
else
:
else
:
return
response
.
unwrap
()
# If we're not in "cooldown" anymore, reset the timer
self
.
_cooldown_since
=
None
return
proj_stat
@projector_connection
(
endpoint
=
"
power-on
"
,
purpose
=
"
power on
"
)
@projector_connection
(
endpoint
=
"
power-on
"
,
purpose
=
"
power on
"
)
async
def
power_on
(
self
)
->
Result
[
None
,
str
]:
async
def
power_on
(
self
)
->
Result
[
None
,
str
]:
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment