Merge pull request #145 from Nitwel/fixes-2

General small fixes
This commit is contained in:
Nitwel 2024-05-06 13:35:17 +02:00 committed by GitHub
commit 3ddc7ca701
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
19 changed files with 346 additions and 240 deletions

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:2b7e5cb00328c9b9d8076a826c368d012628edadf108d078167620945c4742b0 oid sha256:4ceab794a82c7596f1610c929fc5b14a6b2b835c66ffed7d8db1c8804731c23c
size 32849426 size 38613813

View File

@ -10,7 +10,7 @@
[sub_resource type="BoxShape3D" id="BoxShape3D_3qyo4"] [sub_resource type="BoxShape3D" id="BoxShape3D_3qyo4"]
size = Vector3(0.32, 0.16, 0.02) size = Vector3(0.32, 0.16, 0.02)
[sub_resource type="ShaderMaterial" id="ShaderMaterial_h0yvw"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_cw188"]
resource_local_to_scene = true resource_local_to_scene = true
render_priority = 10 render_priority = 10
shader = ExtResource("6_40cd1") shader = ExtResource("6_40cd1")
@ -25,7 +25,7 @@ shader_parameter/corner_radius = 0.8
shader_parameter/roughness = 0.3 shader_parameter/roughness = 0.3
shader_parameter/grain_amount = 0.02 shader_parameter/grain_amount = 0.02
[sub_resource type="QuadMesh" id="QuadMesh_a23j8"] [sub_resource type="QuadMesh" id="QuadMesh_ryeda"]
size = Vector2(0.32, 0.16) size = Vector2(0.32, 0.16)
[node name="Timer" type="StaticBody3D" groups=["entity"]] [node name="Timer" type="StaticBody3D" groups=["entity"]]
@ -78,7 +78,7 @@ label = "stop"
icon = true icon = true
[node name="Panel" parent="." instance=ExtResource("5_j3gsb")] [node name="Panel" parent="." instance=ExtResource("5_j3gsb")]
material_override = SubResource("ShaderMaterial_h0yvw") material_override = SubResource("ShaderMaterial_cw188")
mesh = SubResource("QuadMesh_a23j8") mesh = SubResource("QuadMesh_ryeda")
size = Vector2(0.32, 0.16) size = Vector2(0.32, 0.16)
corner_radius = 0.8 corner_radius = 0.8

View File

@ -10,6 +10,7 @@ const environment_passthrough_material = preload ("res://assets/environment_pass
@onready var house = $House @onready var house = $House
@onready var menu = $Menu @onready var menu = $Menu
@onready var keyboard = $Keyboard @onready var keyboard = $Keyboard
@onready var xr: XRToolsStartXR = $StartXR
var voice_assistant = null var voice_assistant = null
func _ready(): func _ready():
@ -67,6 +68,11 @@ func _ready():
remove_child(keyboard) remove_child(keyboard)
) )
xr.xr_started.connect(func():
if HomeApi.has_connected() == false:
HomeApi.start()
)
func create_voice_assistant(): func create_voice_assistant():
if Store.settings.is_loaded() == false: if Store.settings.is_loaded() == false:
await Store.settings.on_loaded await Store.settings.on_loaded

View File

@ -37,20 +37,22 @@ func _ready():
trash_bin_visible = false trash_bin_visible = false
EventSystem.on_grab_down.connect(func(event: EventPointer): EventSystem.on_grab_down.connect(func(event: EventPointer):
trash_bin_visible=event.target is Entity trash_bin_visible=_get_entity(event.target) != null
) )
EventSystem.on_grab_move.connect(func(event): EventSystem.on_grab_move.connect(func(event):
if !trash_bin_visible: if !trash_bin_visible:
return return
if event.target is Entity&&area.overlaps_body(event.target): var entity=_get_entity(event.target)
if !to_delete.has(event.target):
to_delete.append(event.target) if entity is Entity&&area.overlaps_body(entity):
if !to_delete.has(entity):
to_delete.append(entity)
trash_bin_large=true trash_bin_large=true
else: else:
to_delete.erase(event.target) to_delete.erase(entity)
trash_bin_large=false trash_bin_large=false
) )
@ -64,4 +66,15 @@ func _ready():
to_delete.clear() to_delete.clear()
trash_bin_large=false trash_bin_large=false
trash_bin_visible=false trash_bin_visible=false
House.body.save_all_entities()
) )
func _get_entity(node: Node):
if node is Entity:
return node
if node.get_parent() == null:
return null
return _get_entity(node.get_parent())

View File

@ -174,7 +174,7 @@ func create_entity(entity_id: String, entity_position: Vector3, type=null):
var room = find_room_at(entity_position) var room = find_room_at(entity_position)
if room == null: if room == null:
return null return false
var entity = EntityFactory.create_entity(entity_id, type) var entity = EntityFactory.create_entity(entity_id, type)
@ -192,7 +192,7 @@ func create_entity_in(entity_id: String, room_name: String, type=null):
var room = find_room(room_name) var room = find_room(room_name)
if room == null: if room == null:
return null return false
var entity = EntityFactory.create_entity(entity_id, type) var entity = EntityFactory.create_entity(entity_id, type)

View File

@ -18,8 +18,7 @@ func _ready():
if search.value != "": if search.value != "":
return devices.filter(func(device): return devices.filter(func(device):
var info=device.values()[0] return device["name"].to_lower().find(search.value.to_lower()) != - 1||device["id"].to_lower().find(search.value.to_lower()) != - 1
return info["name"].to_lower().find(search.value.to_lower()) != - 1
) )
return devices return devices
@ -47,13 +46,12 @@ func _ready():
child.free() child.free()
for device in visible_devices.value: for device in visible_devices.value:
var info=device.values()[0]
var button_instance=ButtonScene.instantiate() var button_instance=ButtonScene.instantiate()
button_instance.label=info["name"] button_instance.label=device["name"]
button_instance.font_size=8 button_instance.font_size=8
button_instance.on_button_up.connect(func(): button_instance.on_button_up.connect(func():
on_select_device.emit(device.keys()[0]) on_select_device.emit(device["id"])
) )
grid_container.add_child(button_instance) grid_container.add_child(button_instance)

View File

@ -21,8 +21,11 @@ func _ready():
var entity=House.body.create_entity(entity_name, global_position) var entity=House.body.create_entity(entity_name, global_position)
if entity == null: if typeof(entity) == TYPE_BOOL&&entity == false:
EventSystem.notify("Entity is not in Room", EventNotify.Type.INFO) EventSystem.notify("Entity is not in Room", EventNotify.Type.INFO)
if entity == null:
EventSystem.notify("This Entity is not supported yet", EventNotify.Type.INFO)
) )
entities_page.on_back.connect(func(): entities_page.on_back.connect(func():

View File

@ -22,13 +22,13 @@ func _ready():
var entities=[] var entities=[]
for device in devices: for device in devices:
if device.keys()[0] == selected_device.value: if device["id"] == selected_device.value:
entities=device.values()[0]["entities"] entities=device["entities"]
break break
if search.value != "": if search.value != "":
return entities.filter(func(entity): return entities.filter(func(entity):
return entity.to_lower().find(search.value.to_lower()) != - 1 return entity["name"].to_lower().find(search.value.to_lower()) != - 1||entity["id"].to_lower().find(search.value.to_lower()) != - 1
) )
return entities return entities
@ -61,10 +61,10 @@ func _ready():
for entity in visible_entities.value: for entity in visible_entities.value:
var entity_node=EntityScene.instantiate() var entity_node=EntityScene.instantiate()
entity_node.icon=EntityFactory.get_entity_icon(entity.split(".")[0]) entity_node.icon=EntityFactory.get_entity_icon(entity["id"].split(".")[0])
entity_node.text=entity entity_node.text=entity["name"]
entity_node.on_select.connect(func(): entity_node.on_select.connect(func():
on_select_entity.emit(entity) on_select_entity.emit(entity["id"])
) )
entity_container.add_child(entity_node) entity_container.add_child(entity_node)

View File

@ -0,0 +1,35 @@
extends Node3D
@onready var status_label = $LabelStatus
@onready var input_url = $InputURL
@onready var input_token = $InputToken
@onready var button_connect = $Connect
func _ready():
var settings_store = Store.settings.state
if Store.settings.is_loaded() == false:
await Store.settings.on_loaded
input_url.text = settings_store.url
input_token.text = settings_store.token
button_connect.on_button_down.connect(func():
var url=input_url.text
var token=input_token.text
HomeApi.start_adapter("hass_ws", url, token)
settings_store.url=url
settings_store.token=token
Store.settings.save_local()
)
HomeApi.on_connect.connect(func():
status_label.text="Status: Connected"
)
HomeApi.on_disconnect.connect(func():
status_label.text="Status: Disconnected"
)

View File

@ -0,0 +1,64 @@
[gd_scene load_steps=4 format=3 uid="uid://cdto8shis71nu"]
[ext_resource type="PackedScene" uid="uid://blrhy2uccrdn4" path="res://content/ui/components/input/input.tscn" id="1_01lhk"]
[ext_resource type="Script" path="res://content/ui/menu/settings/menus/api_menu.gd" id="1_uatcf"]
[ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="2_kmvrs"]
[node name="ApiMenu" type="Node3D"]
script = ExtResource("1_uatcf")
[node name="LabelURL" type="Label3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.02, -0.08, 0)
pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "Url:
"
font_size = 18
outline_size = 0
horizontal_alignment = 0
[node name="InputURL" parent="." instance=ExtResource("1_01lhk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.19, -0.08, 0)
text = "ws://192.168.0.1:8123"
size = Vector3(0.2, 0.03, 0.01)
[node name="LabelToken" type="Label3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.02, -0.12, 0)
pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "Token:"
font_size = 18
outline_size = 0
horizontal_alignment = 0
[node name="InputToken" parent="." instance=ExtResource("1_01lhk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.19, -0.12, 0)
text = "..."
size = Vector3(0.2, 0.03, 0.01)
[node name="LabelConnect" type="Label3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.02, -0.17, 0)
pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "Connect:"
font_size = 18
outline_size = 0
horizontal_alignment = 0
[node name="Connect" parent="." instance=ExtResource("2_kmvrs")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.13, -0.17, 0)
label = "login"
icon = true
[node name="LabelStatus" type="Label3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.02, -0.22, 0)
pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "Status: Disconnected"
font_size = 18
outline_size = 0
horizontal_alignment = 0

View File

@ -0,0 +1,39 @@
extends Node3D
@onready var voice_assist = $VoiceAssist
func _ready():
var settings_store = Store.settings.state
if Store.settings.is_loaded() == false:
await Store.settings.on_loaded
var button_label = R.computed(func(_arg):
return "mic_off" if settings_store.voice_assistant == false else "mic"
)
voice_assist.on_button_down.connect(func():
if Store.settings.is_loaded() == false:
await Store.settings.on_loaded
OS.request_permissions()
voice_assist.label="mic"
settings_store.voice_assistant=true
Store.settings.save_local()
)
voice_assist.on_button_up.connect(func():
if Store.settings.is_loaded() == false:
await Store.settings.on_loaded
voice_assist.label="mic_off"
settings_store.voice_assistant=false
Store.settings.save_local()
)
R.bind(voice_assist, "label", button_label)
R.bind(voice_assist, "active", settings_store, "voice_assistant")

View File

@ -0,0 +1,23 @@
[gd_scene load_steps=3 format=3 uid="uid://4hai6lp64m2o"]
[ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="1_52ufi"]
[ext_resource type="Script" path="res://content/ui/menu/settings/menus/features_menu.gd" id="1_imqs2"]
[node name="FeaturesMenu" type="Node3D"]
script = ExtResource("1_imqs2")
[node name="VoiceAssist" parent="." instance=ExtResource("1_52ufi")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.19, -0.08, 0)
label = "mic_off"
icon = true
toggleable = true
[node name="LabelVoiceAssist" type="Label3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.02, -0.08, 0)
pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "Voice Assistant: "
font_size = 18
outline_size = 0
horizontal_alignment = 0

View File

@ -0,0 +1,16 @@
extends Node3D
@onready var save = $Save
@onready var clear_save = $ClearSave
func _ready():
save.on_button_down.connect(func():
House.body.save_all_entities()
Store.house.save_local()
)
clear_save.on_button_down.connect(func():
Store.house.clear()
House.body.update_house()
)

View File

@ -0,0 +1,50 @@
[gd_scene load_steps=3 format=3 uid="uid://cxom4iapa02bb"]
[ext_resource type="Script" path="res://content/ui/menu/settings/menus/save_menu.gd" id="1_7j7hb"]
[ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="1_y2t0y"]
[node name="SaveMenu" type="Node3D"]
script = ExtResource("1_7j7hb")
[node name="SaveLabel" type="Label3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.02, -0.08, 0)
pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "Manual Save:"
font_size = 18
outline_size = 0
horizontal_alignment = 0
[node name="Save" parent="." instance=ExtResource("1_y2t0y")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.18, -0.08, 0)
label = "save"
icon = true
[node name="clearSaveLabel" type="Label3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.02, -0.13, 0)
pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "Clear Save:"
font_size = 18
outline_size = 0
horizontal_alignment = 0
[node name="ClearSave" parent="." instance=ExtResource("1_y2t0y")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.18, -0.14, 0)
label = "close"
icon = true
[node name="clearSaveWarning" type="Label3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.02, -0.15, 0)
pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
modulate = Color(1, 0, 0, 1)
text = "Caution! This will delete all your rooms and placed devices."
font_size = 8
outline_size = 0
horizontal_alignment = 0
autowrap_mode = 3
width = 150.0

View File

@ -1,104 +1,14 @@
extends Node3D extends Node3D
const credits_scene = preload ("./credits.tscn")
@onready var connection_status = $Content/ConnectionStatus
@onready var input_url = $Content/InputURL
@onready var input_token = $Content/InputToken
@onready var button_connect = $Content/Connect
@onready var credits = $Content/Credits/Clickable @onready var credits = $Content/Credits/Clickable
@onready var save = $Content/Save
@onready var clear_save = $Content/ClearSave
@onready var background = $Background @onready var background = $Background
@onready var voice_assist = $Content/VoiceAssist
@onready var version_label = $Content/LabelVersion @onready var version_label = $Content/LabelVersion
func _ready(): func _ready():
_load_game_version() _load_game_version()
var settings_store = Store.settings.state
background.visible = false background.visible = false
credits.on_click.connect(func(_event):
var credits_instance=credits_scene.instantiate()
get_tree().root.add_child(credits_instance)
var label=$Content/Credits/Label
credits_instance.global_position=+ label.to_global(label.position + Vector3(0.1, 0, -0.15))
)
if Store.settings.is_loaded():
input_url.text = settings_store.url
input_token.text = settings_store.token
else:
Store.settings.on_loaded.connect(func():
input_url.text=settings_store.url
input_token.text=settings_store.token
)
button_connect.on_button_down.connect(func():
var url=input_url.text
var token=input_token.text
HomeApi.start_adapter("hass_ws", url, token)
settings_store.url=url
settings_store.token=token
Store.settings.save_local()
)
save.on_button_down.connect(func():
House.body.save_all_entities()
Store.house.save_local()
)
clear_save.on_button_down.connect(func():
Store.house.clear()
House.body.update_house()
)
voice_assist.on_button_down.connect(func():
if Store.settings.is_loaded() == false:
await Store.settings.on_loaded
OS.request_permissions()
voice_assist.label="mic"
settings_store.voice_assistant=true
Store.settings.save_local()
)
voice_assist.on_button_up.connect(func():
if Store.settings.is_loaded() == false:
await Store.settings.on_loaded
voice_assist.label="mic_off"
settings_store.voice_assistant=false
Store.settings.save_local()
)
HomeApi.on_connect.connect(func():
connection_status.text="Connected"
)
HomeApi.on_disconnect.connect(func():
connection_status.text="Disconnected"
)
if Store.settings.is_loaded() == false:
await Store.settings.on_loaded
var button_label = R.computed(func(_arg):
return "mic_off" if settings_store.voice_assistant == false else "mic"
)
R.bind(voice_assist, "label", button_label)
R.bind(voice_assist, "active", settings_store, "voice_assistant")
func _load_game_version(): func _load_game_version():
var presets = ConfigFile.new() var presets = ConfigFile.new()
presets.load("res://export_presets.cfg") presets.load("res://export_presets.cfg")

View File

@ -1,11 +1,15 @@
[gd_scene load_steps=10 format=3 uid="uid://c6r4higceibif"] [gd_scene load_steps=14 format=3 uid="uid://c6r4higceibif"]
[ext_resource type="Script" path="res://content/ui/menu/settings/settings_menu.gd" id="1_0lte6"] [ext_resource type="Script" path="res://content/ui/menu/settings/settings_menu.gd" id="1_0lte6"]
[ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="1_faxng"] [ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="1_faxng"]
[ext_resource type="Script" path="res://content/functions/clickable.gd" id="3_qmg6q"] [ext_resource type="Script" path="res://content/functions/clickable.gd" id="3_qmg6q"]
[ext_resource type="PackedScene" uid="uid://blrhy2uccrdn4" path="res://content/ui/components/input/input.tscn" id="4_q3x6k"]
[ext_resource type="FontVariation" uid="uid://sshfnckriqxn" path="res://assets/icons/icons.tres" id="5_eiwd4"] [ext_resource type="FontVariation" uid="uid://sshfnckriqxn" path="res://assets/icons/icons.tres" id="5_eiwd4"]
[ext_resource type="Shader" path="res://content/ui/components/panel/glass.gdshader" id="6_mubnp"] [ext_resource type="Shader" path="res://content/ui/components/panel/glass.gdshader" id="6_mubnp"]
[ext_resource type="Script" path="res://content/ui/components/tabs/tabs.gd" id="7_oydon"]
[ext_resource type="Script" path="res://content/ui/components/tabs/tabs_content.gd" id="8_ctbdo"]
[ext_resource type="PackedScene" uid="uid://cdto8shis71nu" path="res://content/ui/menu/settings/menus/api_menu.tscn" id="8_jicvf"]
[ext_resource type="PackedScene" uid="uid://4hai6lp64m2o" path="res://content/ui/menu/settings/menus/features_menu.tscn" id="9_k7004"]
[ext_resource type="PackedScene" uid="uid://cxom4iapa02bb" path="res://content/ui/menu/settings/menus/save_menu.tscn" id="10_5aa3y"]
[sub_resource type="BoxShape3D" id="BoxShape3D_3qdps"] [sub_resource type="BoxShape3D" id="BoxShape3D_3qdps"]
size = Vector3(0.07, 0.02, 0.01) size = Vector3(0.07, 0.02, 0.01)
@ -31,62 +35,6 @@ size = Vector2(0.42, 0.32)
script = ExtResource("1_0lte6") script = ExtResource("1_0lte6")
[node name="Content" type="Node3D" parent="."] [node name="Content" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.007, 0)
[node name="ConnectionStatus" type="Label3D" parent="Content"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.251, -0.151, 0)
pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "Disconnected"
font_size = 8
outline_size = 0
[node name="LabelURL" type="Label3D" parent="Content"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.01, -0.03, 0)
pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "url:
"
font_size = 18
outline_size = 0
horizontal_alignment = 0
[node name="InputURL" parent="Content" instance=ExtResource("4_q3x6k")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.18, -0.03, 0)
text = "ws://192.168.0.1:8123"
size = Vector3(0.2, 0.03, 0.01)
[node name="LabelToken" type="Label3D" parent="Content"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.01, -0.07, 0)
pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "token:"
font_size = 18
outline_size = 0
horizontal_alignment = 0
[node name="InputToken" parent="Content" instance=ExtResource("4_q3x6k")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.18, -0.07, 0)
text = "..."
size = Vector3(0.2, 0.03, 0.01)
[node name="LabelConnect" type="Label3D" parent="Content"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.14, -0.12, 0)
pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "Connect"
font_size = 18
outline_size = 0
horizontal_alignment = 0
[node name="Connect" parent="Content" instance=ExtResource("1_faxng")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.25, -0.12, 0)
label = "login"
icon = true
[node name="Credits" type="StaticBody3D" parent="Content"] [node name="Credits" type="StaticBody3D" parent="Content"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.37, -0.300229, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.37, -0.300229, 0)
@ -120,66 +68,6 @@ outline_size = 0
[node name="Clickable" type="Node" parent="Content/Credits"] [node name="Clickable" type="Node" parent="Content/Credits"]
script = ExtResource("3_qmg6q") script = ExtResource("3_qmg6q")
[node name="SaveLabel" type="Label3D" parent="Content"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.01, -0.21, 0)
pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "Manual Save:"
font_size = 18
outline_size = 0
horizontal_alignment = 0
[node name="Save" parent="Content" instance=ExtResource("1_faxng")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.17, -0.21, 0)
label = "save"
icon = true
[node name="clearSaveLabel" type="Label3D" parent="Content"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.01, -0.26, 0)
pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "Clear Save:"
font_size = 18
outline_size = 0
horizontal_alignment = 0
[node name="ClearSave" parent="Content" instance=ExtResource("1_faxng")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.17, -0.27, 0)
label = "close"
icon = true
[node name="clearSaveWarning" type="Label3D" parent="Content"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.01, -0.28, 0)
pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
modulate = Color(1, 0, 0, 1)
text = "Caution! This will delete all your rooms and placed devices."
font_size = 8
outline_size = 0
horizontal_alignment = 0
autowrap_mode = 3
width = 150.0
[node name="VoiceAssist" parent="Content" instance=ExtResource("1_faxng")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.1, -0.12, 0)
label = "mic_off"
icon = true
toggleable = true
[node name="LabelVoiceAssist" type="Label3D" parent="Content"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.01, -0.12, 0)
pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "Voice-
Assist:"
font_size = 18
outline_size = 0
horizontal_alignment = 0
[node name="LabelVersion" type="Label3D" parent="Content"] [node name="LabelVersion" type="Label3D" parent="Content"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.41, -0.31, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.41, -0.31, 0)
pixel_size = 0.001 pixel_size = 0.001
@ -195,3 +83,38 @@ transform = Transform3D(1, 0, 0, 0, 1, 1.06581e-14, 0, -1.06581e-14, 1, 0.21, -0
material_override = SubResource("ShaderMaterial_3iv64") material_override = SubResource("ShaderMaterial_3iv64")
mesh = SubResource("QuadMesh_d0l0p") mesh = SubResource("QuadMesh_d0l0p")
skeleton = NodePath("../..") skeleton = NodePath("../..")
[node name="Tabs" type="Node3D" parent="." node_paths=PackedStringArray("initial_selected")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.01, -0.03, 0)
script = ExtResource("7_oydon")
initial_selected = NodePath("Api")
gap = 0.01
[node name="Api" parent="Tabs" instance=ExtResource("1_faxng")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.02, 0, 0)
font_size = 18
label = "Api"
[node name="Features" parent="Tabs" instance=ExtResource("1_faxng")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.095, 0, 0)
font_size = 18
label = "Features"
size = Vector3(0.09, 0.04, 0.01)
[node name="Save" parent="Tabs" instance=ExtResource("1_faxng")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.18, 0, 0)
font_size = 18
label = "Other"
size = Vector3(0.06, 0.04, 0.01)
[node name="TabsContent3D" type="Node3D" parent="." node_paths=PackedStringArray("tabs")]
script = ExtResource("8_ctbdo")
tabs = NodePath("../Tabs")
[node name="ApiMenu" parent="TabsContent3D" instance=ExtResource("8_jicvf")]
[node name="FeaturesMenu" parent="TabsContent3D" instance=ExtResource("9_k7004")]
visible = false
[node name="SaveMenu" parent="TabsContent3D" instance=ExtResource("10_5aa3y")]
visible = false

View File

@ -29,10 +29,25 @@ signal on_disconnect()
## The current home automation system adapter ## The current home automation system adapter
var api: Node var api: Node
var reconnect_timer := Timer.new()
func _ready(): func _ready():
print("HomeApi ready") print("HomeApi ready")
start()
reconnect_timer.wait_time = 60
reconnect_timer.one_shot = false
reconnect_timer.autostart = true
add_child(reconnect_timer)
reconnect_timer.timeout.connect(func():
if has_connected() == false:
start()
)
## Starts the adapter with the settings from the settings file
func start():
var success = Store.settings.load_local() var success = Store.settings.load_local()
if success: if success:

View File

@ -1,19 +1,23 @@
{% set devices = states | map(attribute='entity_id') | map('device_id') | unique | reject('eq',None) | list %} {% set devices = states | map(attribute='entity_id') | map('device_id') | unique | reject('eq',None) | list %}
{%- set ns = namespace(devices = []) %} {%- set ns = namespace(devices = [], entities = []) %}
{%- for device in devices %} {%- for device in devices %}
{%- set entities = device_entities(device) | list %} {%- set entities = device_entities(device) | list %}
{%- set ns.entities = [] %}
{%- if entities %} {%- if entities %}
{%- set ns.devices = ns.devices + [ {device: {"name": device_attr(device, "name"), "entities": entities }} ] %} {%- for entity in entities %}
{%- set ns.entities = ns.entities + [ {"id": entity, "name": state_attr(entity, "friendly_name")} ] %}
{%- endfor %}
{%- set ns.devices = ns.devices + [{"id": device, "name": device_attr(device, "name"), "entities": ns.entities } ] %}
{%- endif %} {%- endif %}
{%- endfor %} {%- endfor %}
{%- set ns_group = namespace(entities = []) %} {%- set ns_group = namespace(entities = []) %}
{%- for state in states %} {%- for state in states %}
{%- if device_id(state.entity_id) == None %} {%- if device_id(state.entity_id) == None %}
{%- set ns_group.entities = ns_group.entities + [state.entity_id] %} {%- set ns_group.entities = ns_group.entities + [{"id": state.entity_id, "name": state.entity_id}] %}
{%- endif %} {%- endif %}
{%- endfor %} {%- endfor %}
{%- set ns.devices = ns.devices + [ {"other": {"name": "Other", "entities": ns_group.entities }} ] %} {%- set ns.devices = ns.devices + [ {"id": "other.other", "name": "Other", "entities": ns_group.entities } ] %}
{{ ns.devices }} {{ ns.devices }}

View File

@ -10,12 +10,19 @@ func _init():
var devices=await HomeApi.get_devices() var devices=await HomeApi.get_devices()
devices.sort_custom(func(a, b): devices.sort_custom(func(a, b):
return a.values()[0]["name"].to_lower() < b.values()[0]["name"].to_lower() return a["name"].to_lower() < b["name"].to_lower()
) )
for device in devices: for device in devices:
device.values()[0]["entities"].sort_custom(func(a, b): if device["name"] == null:
return a.to_lower() < b.to_lower() device["name"]=device["id"]
for entity in device["entities"]:
if entity["name"] == null:
entity["name"]=entity["id"]
device["entities"].sort_custom(func(a, b):
return a["name"].to_lower() < b["name"].to_lower()
) )
self.state.devices=devices self.state.devices=devices